Browse Source

Merge branch 'master' of http://118.190.145.217:3000/xiaojincai/wzbapi

Gogs 4 years ago
parent
commit
972077cd34
100 changed files with 1686 additions and 5066 deletions
  1. 39 5
      src/common/common_control.py
  2. 1 0
      src/common/common_functions.py
  3. 1 0
      src/common/core_views.py
  4. 30 1
      src/common/models.py
  5. BIN
      src/demo.xls
  6. 115 36
      src/manage/controls.py
  7. 3 0
      src/manage/urls_backstage.py
  8. 118 9
      src/manage/views.py
  9. 0 30
      src/nohup.out
  10. 58 0
      src/req.txt
  11. 1 1
      src/settings/base.py
  12. 16 4
      src/settings/settings_dev.py
  13. 3 11
      src/settings/settings_online.py
  14. 2 2
      src/tools/autocomplete_record.py
  15. 96 0
      src/tools/rank_server.py
  16. 89 0
      src/tools/test.py
  17. 67 0
      src/tools/update_group_rank.py
  18. 53 0
      src/tools/update_records.py
  19. 2 1
      src/utils/exceltool.py
  20. 635 0
      src/wanzb.sql
  21. 7 0
      src/weixin/constants.py
  22. 2 1
      src/weixin/control_auth.py
  23. 297 116
      src/weixin/controls.py
  24. 2 0
      src/weixin/urls_backstage.py
  25. 45 8
      src/weixin/views.py
  26. 4 4
      src/weixin/wzhifuSDK.py
  27. 0 0
      src/zkyuan/__init__.py
  28. 0 0
      src/zkyuan/alipay/__init__.py
  29. 0 268
      src/zkyuan/alipay/alipay.py
  30. 0 254
      src/zkyuan/alipay/alipay__.py
  31. 0 216
      src/zkyuan/alipay/alipay_transfer.py
  32. 0 33
      src/zkyuan/alipay/config.py
  33. 0 27
      src/zkyuan/alipay/config.py.bk
  34. 0 32
      src/zkyuan/alipay/config_transfer.py
  35. 0 20
      src/zkyuan/alipay/hashcompat.py
  36. 0 41
      src/zkyuan/alipay/rsa2key/format_key.py
  37. 0 1
      src/zkyuan/alipay/rsa2key/privkey.txt
  38. 0 1
      src/zkyuan/alipay/rsa2key/pubkey.txt
  39. 0 78
      src/zkyuan/cauth.py
  40. 0 97
      src/zkyuan/control_bankcard.py
  41. 0 81
      src/zkyuan/control_department.py
  42. 0 129
      src/zkyuan/control_organization.py
  43. 0 36
      src/zkyuan/control_permission.py
  44. 0 106
      src/zkyuan/control_role.py
  45. 0 240
      src/zkyuan/control_user.py
  46. 0 711
      src/zkyuan/controls.py
  47. 0 20
      src/zkyuan/hashcompat.py
  48. 0 126
      src/zkyuan/lock_account.py
  49. 0 6
      src/zkyuan/models.py
  50. 0 37
      src/zkyuan/password_handle.py
  51. 0 0
      src/zkyuan/templatetags/__init__.py
  52. 0 17
      src/zkyuan/templatetags/tplfilters.py
  53. 0 11
      src/zkyuan/urls_backstage.py
  54. 0 829
      src/zkyuan/views.py
  55. 0 299
      src/zkyuan/views_backstage.py
  56. 0 4
      src/zkyuan/views_permission.py
  57. 0 125
      src/zkyuan/wxjspay.py
  58. 0 314
      src/zkyuan/wxqrcodepay.py
  59. 0 678
      src/zkyuan/wzhifuSDK.py
  60. BIN
      static/upload/1627651115avatar.jpg
  61. BIN
      static/upload/1627651211696.jpg
  62. BIN
      static/upload/1627709312570.png
  63. BIN
      static/upload/1627709513870.png
  64. BIN
      static/upload/1627709639287.png
  65. BIN
      static/upload/1627709699418.png
  66. BIN
      static/upload/1627709710436.png
  67. BIN
      static/upload/1627709906546.png
  68. BIN
      static/upload/1627710028763.png
  69. BIN
      static/upload/1627710033814.png
  70. BIN
      static/upload/1627710066268.png
  71. BIN
      static/upload/1627711038264.png
  72. BIN
      static/upload/1627721412065.jpg
  73. BIN
      static/upload/1627721951930.jpg
  74. BIN
      static/upload/1627722019678.jpg
  75. BIN
      static/upload/1627735531wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.NK79UQIogbBj972864c4400d0d2cd6758af218cfa843.png
  76. BIN
      static/upload/1627735745wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.pMLTM9YqBb9M972864c4400d0d2cd6758af218cfa843.png
  77. BIN
      static/upload/1627735791wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.tgep9xOorenY972864c4400d0d2cd6758af218cfa843.png
  78. BIN
      static/upload/1627735838wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.H4S8cstZ2mKL972864c4400d0d2cd6758af218cfa843.png
  79. BIN
      static/upload/1627735895wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.wbe7bQn8ca4x4937eb3d39d8d2dea41120630a599ec4.png
  80. BIN
      static/upload/1627735965wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.8s834l54thAa972864c4400d0d2cd6758af218cfa843.png
  81. BIN
      static/upload/1627735996wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.pLDXb15gLr3r402382246a2065cee3c3007b24c5c58b.png
  82. BIN
      static/upload/1627736021wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.pYTgp6IyEMCe401b2930b2e029af60026d7086792265.png
  83. BIN
      static/upload/1627736104wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.162lsN5XrDQW972864c4400d0d2cd6758af218cfa843.png
  84. BIN
      static/upload/1627736115wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.H3oH0etdLBroe64d82b4c534154fd7dd596bf3b48923.png
  85. BIN
      static/upload/1627736248wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.Lqc3At7s75FJ972864c4400d0d2cd6758af218cfa843.png
  86. BIN
      static/upload/1627736254wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.6lUqK0btk8QCe64d82b4c534154fd7dd596bf3b48923.png
  87. BIN
      static/upload/1627736316wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.OdsMMx21C6Dw972864c4400d0d2cd6758af218cfa843.png
  88. BIN
      static/upload/1627736323wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.to9s9oFwBODHe64d82b4c534154fd7dd596bf3b48923.png
  89. BIN
      static/upload/1627736618wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.DMQkGT1NplCK972864c4400d0d2cd6758af218cfa843.png
  90. BIN
      static/upload/1627736701wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.RJ7uEnPuLTmBe64d82b4c534154fd7dd596bf3b48923.png
  91. BIN
      static/upload/1627736971wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.JLyn4C4BtJYc972864c4400d0d2cd6758af218cfa843.png
  92. BIN
      static/upload/1627737199tmp_d9b8dff98c757f955c00483b4e61ec43.jpg
  93. BIN
      static/upload/1627775046644.jpg
  94. BIN
      static/upload/1627776851436.jpg
  95. BIN
      static/upload/1627776945261.jpg
  96. BIN
      static/upload/1627777070703.jpg
  97. BIN
      static/upload/1627777192640.jpg
  98. BIN
      static/upload/1627777303573.jpg
  99. BIN
      static/upload/1627777473334.jpg
  100. 0 0
      static/upload/1627777516142.jpg

+ 39 - 5
src/common/common_control.py

@@ -1,15 +1,46 @@
 # coding:utf-8
-import os,time
+import os,time,datetime
 import sys
 import django
 import json
-from django.core.cache import cache
+#from django.core.cache import cache
 from django.core.paginator import Paginator
 from django.conf import settings
+from django_redis import get_redis_connection
 
 import common.models as cm
 import common.common_functions as ccf
 
+cache = get_redis_connection('data')
+pl = cache.pipeline() 
+
+class CusJSONEncoder(json.JSONEncoder):
+    """
+    JSONEncoder subclass that knows how to encode date/time, decimal types and UUIDs.
+    """
+    def default(self, o):
+        # See "Date Time String Format" in the ECMA-262 specification.
+        if isinstance(o, datetime.datetime):
+            r = datetime.datetime.strftime(o,'%Y-%m-%d %H:%M:%S')
+            return r
+        elif isinstance(o, datetime.date):
+            return o.isoformat()
+        elif isinstance(o, datetime.time):
+            if is_aware(o):
+                raise ValueError("JSON can't represent timezone-aware times.")
+            r = o.isoformat()
+            if o.microsecond:
+                r = r[:12]
+            return r
+        elif isinstance(o, datetime.timedelta):
+            return duration_iso_string(o)
+        elif isinstance(o, decimal.Decimal):
+            return str(o)
+        elif isinstance(o, uuid.UUID):
+            return str(o)
+        else:
+            return super(JSONEncoder, self).default(o)
+
 def cache_data(timeout=60*60):
     def _wrapper(func):
         def __wrapper(*args,**kwargs):
@@ -17,14 +48,17 @@ def cache_data(timeout=60*60):
                 key = "cdata_{}_{}".format(func.__name__,str(args))
             else:
                 key = "cdata_{}".format(func.__name__)
-            if not kwargs.get("cache",True) or not cache.get(key):
+            #if not kwargs.get("cache",True) or not cache.get(key):
+            if not cache.get(key):
                 res = func(*args,**kwargs)
-                cache.set(key,res,timeout)
+                if res:
+                    cache.set(key,json.dumps(res,cls=CusJSONEncoder),timeout)
                 #print u"不取缓存!!!!!!!!!"
                 return res
             else:
                 #print u"取缓存"
-                return cache.get(key)
+                res = cache.get(key)
+                return json.loads(res) if res else {}
         return __wrapper
     return _wrapper
 

+ 1 - 0
src/common/common_functions.py

@@ -185,6 +185,7 @@ def get_ip(request):
 
 if __name__ == "__main__":
     pass
+    print make_password("hnwz@2021")
 
 
 

+ 1 - 0
src/common/core_views.py

@@ -111,6 +111,7 @@ def api_wapper(handler, request, is_vauth, *args, **kwargs):
         if token:
             dec_name = aescbc.decrypt(token)
             id = dec_name.split("_")[0]
+            #id = 80
             user = cm.UserInfo.objects.filter(id=id).first()
             if not user and False:
                 return JsonResponse({"code":403,"data":{}})

+ 30 - 1
src/common/models.py

@@ -11,7 +11,7 @@ class UserInfo(models.Model):
     password = models.CharField(u"密码", max_length=255, blank=True,null=True)
     realname = models.CharField(u"真实名称", max_length=255, blank=True, null=True)
     openid = models.CharField(u"微信openid", max_length=64, blank=True,null=True)
-    avatar = models.CharField(u"手机号", max_length=64, blank=True,null=True)
+    avatar = models.TextField(u"手机号", max_length=255, blank=True,null=True)
     nickname = models.CharField(u"手机号", max_length=64, blank=True,null=True)
 
     is_bind = models.SmallIntegerField(u"是否绑定",default=0)
@@ -78,6 +78,7 @@ class PlayerRecord(models.Model):
     today_income = models.FloatField(u"今日收益",blank=True,null=True)
     total_income = models.FloatField(u"总收益",blank=True,null=True)
     rank = models.IntegerField(u"排名", blank=True,null=True)
+    group_rank = models.IntegerField(u"分组排名", blank=True,null=True)
     is_markt = models.SmallIntegerField(u"是否开超市",default=0)
     yesterday_is_markt = models.SmallIntegerField(u"昨日是否开超市",default=0)
     auto_complete = models.SmallIntegerField(u"请假次数",default=0)
@@ -118,6 +119,7 @@ class MatchGroup(models.Model):
     """
     match_id = models.IntegerField(u"比赛id", blank=True,null=True)
     name = models.CharField(u"名称", max_length=255, blank=True,null=True)
+    is_active = models.SmallIntegerField(u"是否显示",default=1)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -208,3 +210,30 @@ class OperationLog(models.Model):
     class Meta:
         db_table = "oplog"
         verbose_name = u"操作日志"
+
+
+class Article(models.Model):                                                       
+    # 基础属性                                                                     
+    name = models.CharField(u"标题", max_length=255, blank=True,null=True)         
+    content = models.TextField(u"内容",blank=True,null=True)                       
+    status = models.SmallIntegerField(u"下线/上线/编辑中-1/2/1",default=1)
+                                                                                   
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)                    
+    class Meta:                                                                    
+        db_table = "article"                                                       
+        verbose_name = u"文章信息"                                                 
+        app_label = "common"                                                                                                                                                                                                                                                  
+
+
+class test(models.Model):
+    """测试
+    """
+    name = models.CharField(u"标题", max_length=255, blank=True,null=True)         
+    group_rank = models.IntegerField(u"排名",blank=True,null=True)
+
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)                    
+
+    class Meta:                                                                    
+        db_table = "test"                                                       
+        verbose_name = u"测试表"                                                 
+        app_label = "common"                                                                                                                                                                                                                                                  

BIN
src/demo.xls


+ 115 - 36
src/manage/controls.py

@@ -23,12 +23,51 @@ from utils.qrcodetool import gen_general_qrcode
 from django.db.models import Q,Sum,Count
 from PIL import Image
 from PIL import Image,ImageDraw,ImageFont
+from threading import Thread
+#from django.core.cache import cache
+from django.db import connection
 
 import xlrd
 import xlwt
 from xlutils.copy import copy
 from xltpl.writer import BookWriter
 
+def async(f):
+    def wrapper(*args, **kwargs):
+        thr = Thread(target=f, args=args, kwargs=kwargs)
+        thr.start()
+    return wrapper
+
+def update_group_rank_day(match_id,match_group,stock_date):
+    #return
+    ccc.cache.delete("*_"+stock_date)
+    prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
+    records = prset.values()
+    case_id = " case id "
+    cases = []
+    where = []
+    #
+    delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
+    del_keys = ccc.cache.keys(delkey)
+    ccc.cache.delete(*del_keys)
+    for index,pr in enumerate(prset):
+        case = "WHEN %s THEN %s" % (pr.id,index+1)
+        cases.append(case)
+        where.append(str(pr.id))
+        #
+        record = records[index]
+        record.update({"group_rank":index+1})
+        key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
+        ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
+    ccc.pl.execute()
+
+    case = case_id + " ".join(cases)
+    where = ",".join(where)
+    sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
+    cursor = connection.cursor()
+    cursor.execute(sql)
+    cursor.close()
+
 def add_model(cls,**kwargs):
     """
     """
@@ -85,8 +124,9 @@ def add_model(cls,**kwargs):
         if match.end_time < now_date:
             raise ce.TipException(u"该比赛已结束!")
 
+        #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).order_by("-id").first()
+                        match_id=match_id,player_id=player_id).order_by("-stock_date").first()
         if yesterday:
             yesterday_fund = yesterday.today_fund
             yesterday_stock = yesterday.today_stock
@@ -122,11 +162,10 @@ def add_model(cls,**kwargs):
         if not flag:
             obj.ctime = datetime.datetime.now()
         obj.save()
-        #更新排名
-        records_set = cm.PlayerRecord.objects.filter(match_id=match_id).order_by("-total_income")
-        for index,item in enumerate(records_set):
-            item.rank = index+1
-            item.save()
+
+        #更新group_rank
+        update_group_rank_day(match_id,match_group,obj.stock_date)
+
         return obj.id
 
     obj = model.objects.create(**kwargs)
@@ -175,13 +214,16 @@ def update_model(cls,**kwargs):
         obj.today_income = round(today_income,4)
         obj.total_income = round(total_income,4)
         obj.save()
-        #更新排名
-        records_set = cm.PlayerRecord.objects.filter(match_id=obj.match_id).order_by("-total_income")
-        for index,item in enumerate(records_set):
-            item.rank = index+1
-            item.save()
+        #更新player的init_fund
+        player_id = obj.player_id
+        cm.Player.objects.filter(id=player_id).update(fund=init_fund)
+
+        #更新group_rank
+        update_group_rank_day(obj.match_id,obj.match_group,obj.stock_date)
+
     return rst
 
+
 def delete_model(cls,**kwargs):
     """
     """
@@ -201,6 +243,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()
+    #更新group_rank
+    update_group_rank()
     return ids
 
 
@@ -255,15 +299,20 @@ def get_detail_info(cls,**kwargs):
     return rst
 
 
-def get_group_income(match_id,match_group):
+def get_group_income(match_id,match_group,stock_date=None):
     """
     """
     data = []
-    player_ids = list(cm.Player.objects.filter(match_group=match_group).values_list("id",flat=True))
+    if stock_date:
+        today = stock_date
+    else:
+        today = datetime.datetime.now().strftime("%Y-%m-%d")
+    player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
     for player_id in player_ids:
-        today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id).order_by("-stock_date").first()
+        today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today).order_by("-stock_date").first()
         if today_record:
             data.append(today_record.total_income)
+    data = list(set(data))
     data = sorted(data,key=lambda x:x,reverse=True)
     return data
 
@@ -320,27 +369,23 @@ def get_list_info(cls,**kwargs):
                 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
+                #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()
-                group_income = get_group_income(item["match_id"],item["match_group"])
-                if item["total_income"] in group_income:
-                    group_rank = group_income.index(item["total_income"])+1
-                else:
-                    group_rank = 1
-                item["group_rank"] = group_rank
+
                 item["username"] = user.username
                 item["usercode"] = user.usercode
 
                 today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
-                today_stock = filter(lambda x:x["name"],today_stock)
+                today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
                 today_stock_img = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
                 item["today_stock"] = today_stock
                 item["today_stock_img"] = today_stock_img
 
 
                 yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
-                yesterday_stock = filter(lambda x:x["name"],yesterday_stock)
+                yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
 
                 item["yesterday_stock"] = yesterday_stock
                 item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
@@ -388,13 +433,6 @@ def download_records(request):
         qset = qset.filter(stock_date=kwargs.get("stock_date"))
 
     qdata = list(qset.order_by("-total_income").values())
-    for item in qdata:
-        group_income = get_group_income(item["match_id"],item["match_group"])
-        if item["total_income"] in group_income:
-            group_rank = group_income.index(item["total_income"])+1
-        else:
-            group_rank = 1
-        item["group_rank"] = group_rank
 
     if kwargs.get("groupId"):
         qdata = sorted(qdata,key=lambda x:x["group_rank"])
@@ -408,12 +446,12 @@ def download_records(request):
         item["total_income"] = "{}%".format(item["total_income"]*100)
 
         today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
-        today_stock = list(filter(lambda x:x["name"],today_stock))
-        today_stock = ",".join([x["name"]+"("+x["fund"]+"万元)" for x in today_stock]) if today_stock else ""
+        today_stock = list(filter(lambda x:x["name"],today_stock if today_stock else []))
+        today_stock = ",".join([x["name"]+x["fund"] for x in today_stock]) if today_stock else ""
 
         yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
-        yesterday_stock = list(filter(lambda x:x["name"],yesterday_stock))
-        yesterday_stock = ",".join([x["name"]+"("+x["fund"]+"万元)" for x in yesterday_stock]) if yesterday_stock else ""
+        yesterday_stock = list(filter(lambda x:x["name"],yesterday_stock if yesterday_stock else []))
+        yesterday_stock = ",".join([x["name"]+x["fund"] for x in yesterday_stock]) if yesterday_stock else ""
 
         #空仓、开超市、请假判断
         if item["auto_complete"] > 0:
@@ -446,7 +484,8 @@ def download_records(request):
                     yesterday_stock,
                     today_stock
                 ])
-    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsfile = os.path.join(settings.BASE_DIR,"demo.xls")
+    exceltool = ExcelTool(xlsfile)
     xlsdata = exceltool.save_data(u"学员报名数据表",header,data)
 
     return xlsdata
@@ -455,8 +494,8 @@ def download_records(request):
 def fast_save_player(**kwargs):
     """
     """
-    username = kwargs.pop("username")
-    usercode = kwargs.pop("usercode")
+    username = kwargs.get("username")
+    usercode = kwargs.get("usercode")
     if cm.UserInfo.objects.filter(username=username).exists():
         raise ce.TipException(u"用户名重复!")
     if cm.UserInfo.objects.filter(usercode=usercode).exists():
@@ -468,5 +507,45 @@ def fast_save_player(**kwargs):
     cm.Player.objects.create(**kwargs)
 
 
+def update_group_rank(stock_date=None):
+    """
+    """
+    ccc.cache.delete("cdata_*")
+    if stock_date:
+        stock_date = stock_date
+    else:
+        stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
+    ccc.cache.delete("*_"+stock_date)
+    groups = cm.MatchGroup.objects.all()
+    for gp in groups:
+        match_id = gp.match_id
+        match_group = gp.id
+        delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
+        del_keys = ccc.cache.keys(delkey)
+        if del_keys:
+            ccc.cache.delete(*del_keys)
+        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()
+            case_id = " case id "
+            cases = []
+            where = []
+            for index,pr in enumerate(prset):
+                case = "WHEN %s THEN %s" % (pr.id,index+1)
+                cases.append(case)
+                where.append(str(pr.id))
+                #
+                key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
+                record = records[index]
+                record.update({"group_rank":index+1})
+                ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
+            ccc.pl.execute()
+            if cases and where:
+                case = case_id + " ".join(cases)
+                where = ",".join(where)
+                sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
+                cursor = connection.cursor()
+                cursor.execute(sql)
+                cursor.close()
 
 

+ 3 - 0
src/manage/urls_backstage.py

@@ -25,6 +25,9 @@ urlpatterns = [
     url(r'^user/search$', views.UserInfoSearchView.as_view()),
     url(r'^player/fast$', views.PlayerFastSaveView.as_view()),
     url(r'^player/autorecord$', views.PlayerAutoRecordView.as_view()),
+    url(r'^article$', views.ArticleView.as_view()),
+    url(r'^article/list$', views.ArticleListView.as_view()),
+    url(r'^flushrank$', views.FlushRankView.as_view()),
 
 ]
 

+ 118 - 9
src/manage/views.py

@@ -74,7 +74,7 @@ class UserInfoView(cv.AdminView):
         """
         code = ""
         while True:
-            code = "".join([str(random.randint(0,10)) for x in range(0,6)])
+            code = "".join([str(random.choice([0,1,2,3,5,6,7,8,9])) for x in range(0,6)])
             if cm.UserInfo.objects.filter(usercode=code).exists():
                 time.sleep(0.1)
                 continue
@@ -192,7 +192,7 @@ class PlayerView(cv.AdminView):
         try:
             need_params.extend(["match_status"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["fund"] = round(float(vals["fund"]),2)
+            vals["fund"] = round(float(vals["fund"]),4)
             rst = ctl.add_model(self,**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -214,7 +214,7 @@ class PlayerView(cv.AdminView):
         try:
             need_params.extend(["match_status"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["fund"] = round(float(vals["fund"]),2)
+            vals["fund"] = round(float(vals["fund"]),4)
             rst = ctl.update_model(self,**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -375,6 +375,7 @@ class MatchGroupView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
+            need_params.extend(["is_active"])
             vals = ccf.get_need_params(*need_params,**qdata)
             rst = ctl.add_model(self,**vals)
             return cv.to_suc(rst)
@@ -394,6 +395,7 @@ class MatchGroupView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
+            need_params.extend(["is_active"])
             vals = ccf.get_need_params(*need_params,**qdata)
             rst = ctl.update_model(self,**vals)
             return cv.to_suc(rst)
@@ -470,7 +472,7 @@ class PlayerRecordView(cv.AdminView):
         try:
             need_params.extend(["stock_date","is_markt","today_stock","today_stock_img"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["today_fund"] = round(float(vals["today_fund"]),2)
+            vals["today_fund"] = round(float(vals["today_fund"]),4)
             rst = ctl.add_model(self,**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -489,9 +491,11 @@ class PlayerRecordView(cv.AdminView):
         if mse:
             raise ce.TipException(mse)
         try:
-            need_params.extend(["stock_date","is_markt","today_stock","today_stock_img"])
+            need_params.extend(["stock_date","is_markt","today_stock","today_stock_img","yesterday_fund","init_fund"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["today_fund"] = round(float(vals["today_fund"]),2)
+            vals["today_fund"] = round(float(vals["today_fund"]),4)
+            vals["yesterday_fund"] = round(float(vals["yesterday_fund"]),4)
+            vals["init_fund"] = round(float(vals["init_fund"]),4)
             rst = ctl.update_model(self,**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -595,7 +599,7 @@ class PlayerRecordDownloadView(cv.AdminView):
         """
         try:
             xlsdata = ctl.download_records(request)
-            filename = u"参数数据.xls"
+            filename = u"%s参数数据.xls" % datetime.datetime.now().strftime("%Y-%m-%d")
             return cv.stream_file(xlsdata,"application/vnd.ms-excel",filename)
         except Exception as e:
             cv.tracefail()
@@ -609,7 +613,7 @@ class PlayerFastSaveView(cv.AdminView):
         """
         code = ""
         while True:
-            code = "".join([str(random.randint(0,10)) for x in range(0,6)])
+            code = "".join([str(random.choice([0,1,2,3,5,6,7,8,9])) for x in range(0,6)])
             if cm.UserInfo.objects.filter(usercode=code).exists():
                 time.sleep(0.1)
                 continue
@@ -635,7 +639,7 @@ class PlayerFastSaveView(cv.AdminView):
             vals = ccf.get_need_params(*need_params,**qdata)
             if not vals.get("usercode"):
                 vals["usercode"] = self.gen_code()
-            vals["fund"] = round(float(vals["fund"]),2)
+            vals["fund"] = round(float(vals["fund"]),4)
             rst = ctl.fast_save_player(**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -650,3 +654,108 @@ class PlayerAutoRecordView(cv.AdminView):
         from tools.autocomplete_record import auto_gen_record
         auto_gen_record()
         return cv.to_suc()
+
+
+class ArticleView(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):
+        """#新增赛事(平台管理后台)
+        @name:"赛事名称"
+        @content:"详情"
+        """
+        qdata = request.json
+        need_params = ["name","content","status"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            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"
+        @name:"名称"
+        @content:"详情"
+        """
+        qdata = request.json
+        need_params = ["id","name","content","status"]
+        mse = ccf.check_params(*need_params,**qdata)
+        if mse:
+            raise ce.TipException(mse)
+        try:
+            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)
+
+
+class ArticleListView(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 FlushRankView(cv.AdminView):
+    def get(self, request):
+        """#更新排名(平台管理后台)
+        @name:""
+        @page:1
+        @page_size:20
+        """
+        qdata = request.json
+        try:
+            stock_date = qdata.get("stock_date")
+            ctl.update_group_rank(stock_date)
+            return cv.to_suc()
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)

+ 0 - 30
src/nohup.out

@@ -1,30 +0,0 @@
-Traceback (most recent call last):
-  File "/usr/lib/python2.7/runpy.py", line 174, in _run_module_as_main
-    "__main__", fname, loader, pkg_name)
-  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
-    exec code in run_globals
-  File "/mnt/wzbapi/src/tools/autocomplete_record.py", line 92, in <module>
-    auto_gen_record()
-  File "/mnt/wzbapi/src/tools/autocomplete_record.py", line 25, in auto_gen_record
-    for pla in plaset:
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/models/query.py", line 250, in __iter__
-    self._fetch_all()
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/models/query.py", line 1102, in _fetch_all
-    self._result_cache = list(self._iterable_class(self))
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/models/query.py", line 53, in __iter__
-    results = compiler.execute_sql(chunked_fetch=self.chunked_fetch)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 876, in execute_sql
-    cursor.execute(sql, params)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
-    return self.cursor.execute(sql, params)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/utils.py", line 94, in __exit__
-    six.reraise(dj_exc_type, dj_exc_value, traceback)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/backends/utils.py", line 65, in execute
-    return self.cursor.execute(sql, params)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/django/db/backends/mysql/base.py", line 101, in execute
-    return self.cursor.execute(query, args)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/MySQLdb/cursors.py", line 205, in execute
-    self.errorhandler(self, exc, value)
-  File "/mnt/py27dj11env/lib/python2.7/site-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler
-    raise errorclass, errorvalue
-django.db.utils.OperationalError: (2006, 'MySQL server has gone away')

+ 58 - 0
src/req.txt

@@ -0,0 +1,58 @@
+aliyun-python-sdk-core==2.13.30
+aliyun-python-sdk-core-v3==2.13.11
+aliyun-python-sdk-kms==2.14.0
+asn1crypto==1.3.0
+backports-abc==0.5
+backports.functools-lru-cache==1.6.1
+backports.ssl-match-hostname==3.7.0.1
+beautifulsoup4==4.9.1
+bs4==0.0.1
+certifi==2020.4.5.1
+cffi==1.14.0
+chardet==3.0.4
+crcmod==1.7
+cryptography==3.2.1
+Django==1.11
+django-redis==4.8.0
+docxtpl==0.9.2
+enum34==1.1.10
+et-xmlfile==1.0.1
+gevent==1.5.0
+greenlet==0.4.15
+gunicorn==19.7.1
+idna==2.9
+ipaddress==1.0.23
+jdcal==1.4.1
+Jinja2==2.11.2
+jmespath==0.9.5
+jpush==3.3.8
+lxml==4.5.0
+#M2Crypto==0.31.0
+MarkupSafe==1.1.1
+MySQL-python==1.2.5
+numpy==1.16.6
+opencv-python==4.2.0.32
+openpyxl==2.6.4
+oss2==2.13.1
+paginate==0.5.6
+Pillow==5.3.0
+pycparser==2.20
+pycrypto==2.6.1
+pycryptodome==3.9.7
+python-docx==0.8.10
+pytz==2019.3
+qrcode==6.1
+rarfile==3.1
+redis==3.4.1
+requests==2.9.1
+singledispatch==3.4.0.3
+six==1.14.0
+soupsieve==1.9.6
+tornado==4.3
+typing==3.7.4.1
+ua-parser==0.10.0
+user-agents==2.2.0
+xlrd==1.1.0
+xltpl==0.2.2
+xlutils==2.0.0
+xlwt==1.3.0

+ 1 - 1
src/settings/base.py

@@ -56,7 +56,7 @@ MIDDLEWARE = [
     'django.middleware.csrf.CsrfViewMiddleware',
     'django.contrib.messages.middleware.MessageMiddleware',
     'django.middleware.clickjacking.XFrameOptionsMiddleware',
-    'oplog.OpLogMiddleware.OpLogMiddleware'
+    #'oplog.OpLogMiddleware.OpLogMiddleware'
 ]
 
 ROOT_URLCONF = 'urls'

+ 16 - 4
src/settings/settings_dev.py

@@ -6,6 +6,15 @@ CACHES = {
     'default': {
         'BACKEND': 'django_redis.cache.RedisCache',
         'LOCATION': 'redis://127.0.0.1:6379/0',
+        'TIMEOUT': 60*10,
+        "OPTIONS": {
+            "CLIENT_CLASS": "django_redis.client.default.DefaultClient",
+        },
+    },
+    'data': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': 'redis://127.0.0.1:6379/1',
+        'TIMEOUT': 60*60*24,
         "OPTIONS": {
             "CLIENT_CLASS": "django_redis.client.default.DefaultClient",
         },
@@ -17,10 +26,11 @@ DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'wanzb',
-        'USER': 'root',
-        'PASSWORD': 'xjc890*()',
-        'HOST': '127.0.0.1',
+        'USER': 'wanzb',
+        'PASSWORD': 'wanzb890*()',
+        'HOST': '172.29.110.52',
         'PORT': '3306',
+        'OPTIONS':{'charset':'utf8mb4'}
     }
 }
 
@@ -59,5 +69,7 @@ LOGGING = {
     },
 }
 
-HOST = "https://test.scxjc.club"
+RANK_LIST = "RANK_LIST"
+
+HOST = "https://www.hunanwanzhu.com"
 PROJECT_NAME = u"顽主杯"

+ 3 - 11
src/settings/settings_online.py

@@ -16,22 +16,14 @@ CACHES = {
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
-        'NAME': 'xeshop',
-        'USER': 'root',
-        'PASSWORD': 'xjc890*()',
+        'NAME': 'wanzb',
+        'USER': 'wanzb',
+        'PASSWORD': 'wanzb890*()',
         'HOST': '127.0.0.1',
         'PORT': '3306',
     }
 }
 
-# 短信配置  common.sms.py使用
-SMS_ACCOUNT_SID = "8a216da8588b296f01588ecd0a0001ab"
-SMS_AUTH_TOKEN = "f0d2b53782374ebc8a76fa8dd06bb4d2"
-SMS_APP_ID = "8a216da8589ae4840158a89b5c8f0272"
-SMS_URL = "https://app.cloopen.com:8883/2013-12-26/Accounts/%s/SMS/TemplateSMS" % SMS_ACCOUNT_SID
-SMS_LOG_PATH = os.path.join(BASE_DIR, "../logs", "sms")
-SEND_SMS = False
-
 # 验证码字体库位置
 FONT_PATH = os.path.join(BASE_DIR, "../static/font", "consola.ttf")
 

+ 2 - 2
src/tools/autocomplete_record.py

@@ -75,12 +75,12 @@ def auto_gen_record():
                         auto_complete=1
                     )
                 #更新排名与请假标识
-                records_set = cm.PlayerRecord.objects.filter(match_id=match_id).order_by("-total_income")
+                records_set = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=now_stock_date).order_by("-total_income")
                 for index,item in enumerate(records_set):
                     item.rank = index+1
                     item.save()
                 #更新请假标识
-                records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id,auto_complete__gt=0).order_by("-stock_date")
+                records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id,match_group=match_group,stock_date=now_stock_date,auto_complete__gt=0).order_by("-stock_date")
                 for index,item in enumerate(records_set):
                     item.auto_complete = index+1
                     item.save()

+ 96 - 0
src/tools/rank_server.py

@@ -0,0 +1,96 @@
+#coding:utf-8
+import os
+import time
+import datetime
+import sys
+import django,json
+from django.db import connection
+from django.conf import settings
+
+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 rank_server():
+    """
+    """
+    rcid = ccc.cache.rpop(settings.RANK_LIST)
+    record = cm.PlayerRecord.objects.filter(id=rcid).first()
+    if record:
+        match_id = int(record.match_id)
+        match_group = int(record.match_group)
+        stock_date = record.stock_date
+        if "15:00"<datetime.datetime.now().strftime("%H:%M") < "15:30":
+            update_cache_rank(match_id,match_group,stock_date)
+        else:
+            sync_group_rank(match_id,match_group,stock_date)
+
+def update_cache_rank(match_id,match_group,stock_date):
+    """
+    """
+    print "update cache rank..."
+    delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
+    del_keys = ccc.cache.keys(delkey)
+    #if del_keys:
+    #    ccc.cache.delete(*del_keys)
+
+    prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
+    records = prset.values()
+    case_id = " case id "
+    cases = []
+    where = []
+    for index,pr in enumerate(prset):
+        key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
+        record = records[index]
+        record.update({"group_rank":index+1})
+        ccc.cache.delete(key)
+        ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
+    ccc.pl.execute()
+
+def sync_group_rank(match_id,match_group,stock_date):
+    """
+    """
+    print "sync group rank..."
+    delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
+    del_keys = ccc.cache.keys(delkey)
+    #if del_keys:
+    #    ccc.cache.delete(*del_keys)
+
+    prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
+    records = prset.values()
+    case_id = " case id "
+    cases = []
+    where = []
+    for index,pr in enumerate(prset):
+        case = "WHEN %s THEN %s" % (pr.id,index+1)
+        cases.append(case)
+        where.append(str(pr.id))
+        #
+        key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
+        record = records[index]
+        record.update({"group_rank":index+1})
+        ccc.cache.delete(key)
+        ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
+    ccc.pl.execute()
+    #同步数据库
+    if cases and where:
+        case = case_id + " ".join(cases)
+        where = ",".join(where)
+        sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
+        cursor = connection.cursor()
+        cursor.execute(sql)
+        cursor.close()
+
+if __name__ == "__main__":
+    print "start update group rank..."
+    while True:
+        rank_server()
+        time.sleep(0.1)
+
+
+
+
+

+ 89 - 0
src/tools/test.py

@@ -0,0 +1,89 @@
+#coding:utf-8
+import os
+import time
+import datetime
+import sys
+import django
+from django.core.cache import cache
+
+sys.path.append('/mnt/wzbapi/src')
+os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
+django.setup()
+
+import common.models as cm
+from django.db import connection
+
+def mult_create(stock_date=None):
+    """
+    """
+    if stock_date:
+        today = stock_date
+    else:
+        today = datetime.datetime.now().strftime("%Y-%m-%d")
+    print today
+    tests = []
+    for i in range(1,2001):
+        tests.append(cm.test(
+            id = i,
+            name = today,
+            group_rank = i
+        ))
+    cm.test.objects.bulk_create(tests)
+
+
+def mult_update(stock_date=None):
+    """
+    """
+    if stock_date:
+        today = stock_date
+    else:
+        today = datetime.datetime.now().strftime("%Y-%m-%d")
+    qset = cm.test.objects.all()
+    for i,obj in enumerate(qset):
+        obj.group_rank = i
+        obj.save()
+
+
+def mult_update_1(stock_date=None):
+    """
+    """
+    if stock_date:
+        today = stock_date
+    else:
+        today = datetime.datetime.now().strftime("%Y-%m-%d")
+    print today
+    tests = []
+    case_id = " case id "
+    cases = []
+    where = []
+    for i in range(1,2001):
+        case = "WHEN %s THEN %s" % (i,i*10)
+        cases.append(case)
+        where.append(str(i))
+    case = case_id + " ".join(cases)
+    where = ",".join(where)
+
+    sql = "update test set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
+    #print sql
+    cursor = connection.cursor()
+    #cm.test.objects.raw(sql)
+    cursor.execute(sql)
+
+
+
+if __name__ == "__main__":
+    print "start update group rank..."
+    st = time.time()
+    qset = cm.PlayerRecord.objects.filter(match_id=7,match_group=27,stock_date="2021-10-15").order_by("-total_income")
+    qset.values()
+    #mult_create()
+    #mult_update()
+    print "time cost:",time.time()-st
+    st = time.time()
+    mult_update_1()
+    print "time cost:",time.time()-st
+
+
+
+
+

+ 67 - 0
src/tools/update_group_rank.py

@@ -0,0 +1,67 @@
+#coding:utf-8
+import os
+import time
+import datetime
+import sys
+import django
+import common.common_control as ccc
+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 update_group_rank(stock_date=None):
+    """
+    """
+    ccc.cache.delete("cdata_*")
+    if stock_date:
+        stock_date = stock_date
+    else:
+        stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
+    ccc.cache.delete("*_"+stock_date)
+    groups = cm.MatchGroup.objects.all()
+    for gp in groups:
+        match_id = gp.match_id
+        match_group = gp.id
+        delkey = "*_%s_%s_%s" % (match_id,match_group,stock_date)
+        del_keys = ccc.cache.keys(delkey)
+        ccc.cache.delete(*del_keys)
+        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()
+            case_id = " case id "
+            cases = []
+            where = []
+            for index,pr in enumerate(prset):
+                case = "WHEN %s THEN %s" % (pr.id,index+1)
+                cases.append(case)
+                where.append(str(pr.id))
+                #
+                key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
+
+                record = records[index]
+                record.update({"group_rank":index+1})
+                ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
+            ccc.pl.execute()
+            case = case_id + " ".join(cases)
+            where = ",".join(where)
+            sql = "update player_record set group_rank = %s ELSE 0 END where id in (%s)" % (case,where)
+            cursor = connection.cursor()
+            cursor.execute(sql)
+            cursor.close()
+
+
+
+if __name__ == "__main__":
+    print "start update group rank..."
+    st = time.time()
+    update_group_rank()
+    print "time cost:",time.time()-st
+
+
+
+
+

+ 53 - 0
src/tools/update_records.py

@@ -0,0 +1,53 @@
+#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 update_records():
+    """
+    """
+    prset = cm.PlayerRecord.objects.filter(stock_date="2021-10-18")
+    for index,pr in enumerate(prset):
+        player_id = pr.player_id
+        match_id = pr.match_id
+        match_group = pr.match_group
+        yesterday = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id,match_group=match_group,stock_date="2021-10-15").first()
+        if yesterday:
+            pr.yesterday_fund = yesterday.today_fund
+            pr.yesterday_stock = yesterday.today_stock
+            pr.yesterday_stock_img = yesterday.today_stock_img
+            #
+            init_fund = pr.init_fund
+            today_fund = pr.today_fund
+            yesterday_fund = pr.yesterday_fund
+
+            today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
+            total_income = (today_fund - init_fund)/float(init_fund)
+
+            pr.today_income = round(today_income,4)
+            pr.total_income = round(total_income,4)
+
+            pr.save()
+
+
+
+if __name__ == "__main__":
+    print "start update group rank..."
+    st = time.time()
+    update_records()
+    print "time cost:",time.time()-st
+
+
+
+
+

+ 2 - 1
src/utils/exceltool.py

@@ -21,9 +21,10 @@ class ExcelTool(object):
             sheet.write(0,i,header[i])
 
         #添加数据
+        style = xlwt.easyxf('align: wrap on')
         for i in range(0,len(data)):
             for j in range(0,len(data[i])): 
-                sheet.write(i+1,j,data[i][j])
+                sheet.write(i+1,j,data[i][j],style)
         output = StringIO.StringIO()
         self.book.save(output)
         self.book.save("/tmp/demo.xls")

File diff suppressed because it is too large
+ 635 - 0
src/wanzb.sql


+ 7 - 0
src/weixin/constants.py

@@ -0,0 +1,7 @@
+#-*-coding:utf-8 -*-
+
+#不能提交数据的日期(周六周日可不配置)
+MISS_DATES = [
+    "2021-10-30",        
+    "2021-10-31",        
+]

+ 2 - 1
src/weixin/control_auth.py

@@ -21,7 +21,7 @@ def add_wxauth_info(request):
         raise ce.TipException(mse)
     vals = ccf.get_need_params(*need_params,**qdata)
     obj,flag = cm.UserInfo.objects.get_or_create(openid=vals.get("openid"))
-    obj.nickname = vals.get("nickname")
+    obj.nickname = vals.get("username")
     obj.avatar = vals.get("avatar")
     obj.save()
     return obj
@@ -34,6 +34,7 @@ def get_wxauth_info(request):
     uid = request.user.id
     print uid
     user = cm.UserInfo.objects.filter(id=uid).values().first()
+    user["nickname"] = user["username"]
     return user
 
 

+ 297 - 116
src/weixin/controls.py

@@ -23,11 +23,64 @@ from utils.qrcodetool import gen_general_qrcode
 from django.db.models import Q,Sum,Count
 from PIL import Image
 from PIL import Image,ImageDraw,ImageFont
+from django.db import transaction
+from threading import Thread
+#from django.core.cache import cache
+from django.db import connection
 
 import xlrd
 import xlwt
 from xlutils.copy import copy
 from xltpl.writer import BookWriter
+from django_redis import get_redis_connection
+from constants import *
+
+def async(f):
+    def wrapper(*args, **kwargs):
+        thr = Thread(target=f, args=args, kwargs=kwargs)
+        thr.start()
+    return wrapper
+
+
+def get_today_date():
+    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
+        else:
+            if datetime.datetime.now().weekday()==0:
+                today = (datetime.datetime.now()-datetime.timedelta(days=3)).strftime("%Y-%m-%d")
+            else:
+                today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
+    else:
+        if datetime.datetime.now().weekday() in [5,6] or datetime.datetime.now().strftime("%Y-%m-%d") in MISS_DATES:
+            today = cm.PlayerRecord.objects.all().order_by("-stock_date").first().stock_date
+        else:
+            today = datetime.datetime.now().strftime("%Y-%m-%d")
+    return today
+    #return '2021-11-05'
+
+#@async
+def update_group_rank(match_id,match_group,stock_date):
+    #return
+    prset = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,stock_date=stock_date).order_by("-total_income")
+    records = prset.values()
+    case_id = " case id "
+    cases = []
+    where = []
+    for index,pr in enumerate(prset):
+        key = "%s_%s_%s_%s" % (pr.player_id,match_id,match_group,stock_date)
+        record = records[index]
+        record.update({"group_rank":index+1})
+        ccc.cache.delete(key)
+        ccc.pl.set(key,json.dumps(record,cls=ccc.CusJSONEncoder))
+    ccc.pl.execute()
+
+#@ccc.cache_data()
+def get_notices():
+    """
+    """
+    notices = list(cm.Article.objects.filter(status=2).values())
+    return notices
 
 def get_index_data(request):
     """首页数据
@@ -37,20 +90,28 @@ def get_index_data(request):
         raise ce.TipException(u"该账号未参加任何赛事!")
     player_id = player.id
     match_id = player.match_id
-    match_name = cm.Match.objects.filter(id=match_id).first().name
-    records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id).order_by("-stock_date")
+    match_group = player.match_group
+
+    #if datetime.datetime.now().hour < 15:
+    #    today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
+    #else:
+    #    today = datetime.datetime.now().strftime("%Y-%m-%d")
+    today = get_today_date()
+
+    match_name = get_match_info(match_id).get("name")
+
+    records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id)
     if records_set:
-        today_record = records_set.first()
-        cur_rank = records_set.first().rank
-        group_income = get_group_income(today_record.match_id,today_record.match_group)
-        if today_record.total_income in group_income:
-            cur_rank = group_income.index(today_record.total_income)+1
-        else:
-            cur_rank = 1
-        records = list(records_set.values())[:10]
+        try:
+            cur_rank = get_today_record(player_id,match_id,match_group,today).get("group_rank","")
+            records = list(records_set.order_by("-stock_date").values())
+        except:
+            cur_rank = 0 
+            records = []
     else:
         cur_rank = 0 
         records = []
+
     for item in records:
         today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
         today_stock = filter(lambda x:x["name"],today_stock)
@@ -62,7 +123,9 @@ def get_index_data(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)
-    ret = {"match_name":match_name,"cur_rank":cur_rank,"records":records}
+    #通知
+    notices = get_notices()
+    ret = {"match_name":match_name,"cur_rank":cur_rank,"records":records,"notices":notices}
 
     return ret
 
@@ -80,11 +143,13 @@ def get_group_income(match_id,match_group):
     """
     """
     data = []
-    player_ids = list(cm.Player.objects.filter(match_group=match_group).values_list("id",flat=True))
+    today = datetime.datetime.now().strftime("%Y-%m-%d")
+    player_ids = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values_list("id",flat=True))
     for player_id in player_ids:
-        today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id).order_by("-stock_date").first()
+        today_record = cm.PlayerRecord.objects.filter(match_id=match_id,match_group=match_group,player_id=player_id,stock_date=today).first()
         if today_record:
             data.append(today_record.total_income)
+    data = list(set(data))
     data = sorted(data,key=lambda x:x,reverse=True)
     return data
 
@@ -94,11 +159,13 @@ def get_player_match_detail(request):
     """
     qdata = request.json
     player_id = request.player.id
+    match_group = request.player.match_group
     match_id = qdata.get("id")
     record_id = qdata.get("record_id")
     if record_id:
         records_set = cm.PlayerRecord.objects.filter(id=record_id)
         match_id = records_set.first().match_id
+        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")
     else:
@@ -108,11 +175,13 @@ def get_player_match_detail(request):
     groups = list(cm.MatchGroup.objects.filter(match_id=match_id).values_list("name",flat=True))
     match["groups"] = groups
     if records_set:
-        today_record = records_set.values().first()
-        records = list(records_set.values())[:10]
+        #today_record = records_set.values().first()
+        records = list(records_set.values())
     else:
-        today_record = {}
+        #today_record = {}
         records = []
+    today = get_today_date()
+    today_record = get_today_record(player_id,int(match_id),int(match_group),today)
 
     for item in records:
         item["today_stock"] = json.loads(item["today_stock"]) if item["today_stock"] else []
@@ -122,10 +191,6 @@ def get_player_match_detail(request):
         item["today_income"] = "{}%".format(item["today_income"]*100)
         item["total_income"] = "{}%".format(item["total_income"]*100)
     if today_record:
-        group_income = get_group_income(today_record["match_id"],today_record["match_group"])
-        group_rank = group_income.index(today_record["total_income"])+1
-        today_record["group_rank"] = group_rank
-
         today_record["today_income"] = "{}%".format(today_record["today_income"]*100)
         today_record["total_income"] = "{}%".format(today_record["total_income"]*100)
         today_record["match_group_name"] = cm.MatchGroup.objects.filter(id=today_record["match_group"]).first().name
@@ -136,87 +201,152 @@ def get_player_match_detail(request):
     return ret
 
 
-def get_rank_list(request):
-    """排名列表
+#@ccc.cache_data()
+#def get_today_record(player_id,match_id,match_group,today):
+#    records_set = cm.PlayerRecord.objects.filter(player_id=player_id,match_id=match_id,match_group=match_group,stock_date=today)
+#    if records_set:
+#        today_record = records_set.values().first()
+#    else:
+#        today_record = {}
+#    return today_record
+
+def get_today_record(player_id,match_id,match_group,today):
+    """
+    """
+    key = "%s_%s_%s_%s" % (player_id,match_id,match_group,today)
+    today_record = ccc.cache.get(key)
+    today_record = json.loads(today_record) if today_record else {}
+    return today_record
+
+@ccc.cache_data()
+def get_match_group_players(match_id,match_group):
+    players = list(cm.Player.objects.filter(match_id=match_id,match_group=match_group).values())
+    return players
+
+#@ccc.cache_data()
+def get_match_groups(match_id):
+    """
     """
-    qdata = request.json
-    player_id = request.player.id
-    match_id = request.player.match_id
     match = cm.Match.objects.filter(id=match_id).values().first()
-    
-    groups = list(cm.MatchGroup.objects.filter(match_id=match_id).values())
+    groups = list(cm.MatchGroup.objects.filter(match_id=match_id,is_active=1).values())
+    return match,groups
+
+#@ccc.cache_data()
+def get_cache_rank_list(player_id,match_id):
+    """
+    """
+    match,groups = get_match_groups(match_id)
+
+    #if datetime.datetime.now().hour < 15:
+    #    today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
+    #else:
+    #    today = datetime.datetime.now().strftime("%Y-%m-%d")
+    today = get_today_date()
 
     for item in groups:
         new_players = []
-        players = list(cm.Player.objects.filter(match_id=match_id,match_group=item["id"]).values())
+        players = get_match_group_players(match_id,item["id"])
         for player in players:
             user_id = player["user_id"]
-            user = cm.UserInfo.objects.filter(id=user_id).first()
-            username = user.username if user else ""
-            records_set = cm.PlayerRecord.objects.filter(player_id=player["id"],match_id=match_id,match_group=item["id"]).order_by("-stock_date")
-            if records_set:
-                today_record = records_set.values().first()
-            else:
-                today_record = {}
+            user = get_user_info(user_id) 
+            username = user["username"] if user else ""
+
+            player_id = player["id"]
+            match_group = item["id"]
+            today_record = get_today_record(player_id,match_id,match_group,today)
             if today_record:
                 player.update(today_record)
                 player["username"] = username
                 player["total_income"] = "{}%".format(today_record["total_income"]*100)
-                #计算分组排名
-                group_income = get_group_income(today_record["match_id"],today_record["match_group"])
-                if today_record["total_income"] in group_income:
-                    group_rank = group_income.index(today_record["total_income"])+1
-                else:
-                    group_rank = 1
-                player["group_rank"] = group_rank
-                player["fund"] = round(player["fund"],2)
-                player["init_fund"] = round(player["init_fund"],2)
-                player["today_fund"] = round(player["today_fund"],2)
+
+                player["fund"] = round(player["fund"],4)
+                player["init_fund"] = round(player["init_fund"],4)
+                player["today_fund"] = round(player["today_fund"],4)
                 new_players.append(player)
         new_players = sorted(new_players,key=lambda x:x["group_rank"])
         item["players"] = new_players[:3]
+    return match,groups
+
+
+def get_rank_list(request):
+    """排名列表
+    """
+    qdata = request.json
+    player_id = request.player.id
+    match_id = request.player.match_id
+    match,groups = get_cache_rank_list(player_id,match_id)
 
     ret = {"match":match,"groups":groups}
 
     return ret
 
 
+@ccc.cache_data()
+def get_user_info(uid):
+    user = cm.UserInfo.objects.filter(id=uid).values().first()
+    return user
+
+@ccc.cache_data()
+def get_match_info(match_id):
+    match = cm.Match.objects.filter(id=match_id).values().first()
+    return match
+
+@ccc.cache_data()
+def get_group_info(group_id):
+    group = cm.MatchGroup.objects.filter(id=group_id).values().first()
+    return group
+
+
 def get_group_rank_list(request):
     """排名列表
     """
     qdata = request.json
-    group_id = qdata.get("id")
+    kwargs = qdata
 
+    group_id = qdata.get("id")
     player_id = request.player.id
     match_id = request.player.match_id
-    match = cm.Match.objects.filter(id=match_id).values().first()
-    
-    group = cm.MatchGroup.objects.filter(id=group_id).values().first()
 
-    players = list(cm.Player.objects.filter(match_id=match_id,match_group=group_id).values())
+    match = get_match_info(match_id)
+    group = get_group_info(group_id)
+
+    #if datetime.datetime.now().hour < 15:
+    #    today = (datetime.datetime.now()-datetime.timedelta(days=1)).strftime("%Y-%m-%d")
+    #else:
+    #    today = datetime.datetime.now().strftime("%Y-%m-%d")
+
+    today = get_today_date()
+    #players = list(cm.Player.objects.filter(match_id=match_id,match_group=group_id).values())
+    players = get_match_group_players(match_id,group_id)
     new_players = []
     for player in players:
         user_id = player["user_id"]
-        user = cm.UserInfo.objects.filter(id=user_id).first()
-        username = user.username if user else ""
-        records_set = cm.PlayerRecord.objects.filter(player_id=player["id"],match_id=match_id,match_group=group_id).order_by("-stock_date")
-        if records_set:
-            today_record = records_set.values().first()
-        else:
-            today_record = {}
+        user = get_user_info(user_id) 
+        username = user["username"] if user else ""
+
+        player_id = player["id"]
+        match_group = group_id
+        today_record = get_today_record(player_id,match_id,int(match_group),today)
+
         if today_record:
             player.update(today_record)
-            group_income = get_group_income(today_record["match_id"],today_record["match_group"])
-            group_rank = group_income.index(today_record["total_income"])+1
-            player["group_rank"] = group_rank
             player["username"] = username
             player["total_income"] = "{}%".format(player["total_income"]*100)
-            player["fund"] = round(player["fund"],2)
-            player["init_fund"] = round(player["init_fund"],2)
-            player["today_fund"] = round(player["today_fund"],2)
+            player["fund"] = round(player["fund"],4)
+            player["init_fund"] = round(player["init_fund"],4)
+            player["today_fund"] = round(player["today_fund"],4)
             new_players.append(player)
     new_players = sorted(new_players,key=lambda x:x["group_rank"])
-    ret = {"group":group,"players":new_players}
+
+    #分页
+    page = int(kwargs.get("page",0))
+    page_size = int(kwargs.get("page_size",20))
+    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)
+    ret = {"group":group,"players":new_players,"total":total}
 
     return ret
 
@@ -237,11 +367,11 @@ def get_player_match_records(request):
     data = list(records_set.values())
     for item in data:
         today_stock = json.loads(item["today_stock"]) if item["today_stock"] else []
-        today_stock = filter(lambda x:x["name"],today_stock)
+        today_stock = filter(lambda x:x["name"],today_stock if today_stock else [])
         item["today_stock"] = today_stock 
         item["today_stock_img"] = json.loads(item["today_stock_img"]) if item["today_stock_img"] else []
         yesterday_stock = json.loads(item["yesterday_stock"]) if item["yesterday_stock"] else []
-        yesterday_stock = filter(lambda x:x["name"],yesterday_stock)
+        yesterday_stock = filter(lambda x:x["name"],yesterday_stock if yesterday_stock else [])
         item["yesterday_stock"] = yesterday_stock
         item["yesterday_stock_img"] = json.loads(item["yesterday_stock_img"]) if item["yesterday_stock_img"] else []
         item["today_income"] = "{}%".format(item["today_income"]*100)
@@ -275,12 +405,15 @@ def add_model(cls,**kwargs):
             raise ce.TipException(u"重复添加选手!")
 
     if model_name == "PlayerRecord":
+        now = datetime.datetime.now()
+        if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
+            raise ce.TipException(u"今日不能提交数据!")
         match_id = kwargs.get("match_id")
         stock_date = kwargs.get("stock_date")
         today_stock = json.dumps(kwargs.get("today_stock"))
         today_stock_img = json.dumps(kwargs.get("today_stock_img"))
         player_id = kwargs.get("player_id")
-        today_fund = float(kwargs.get("today_fund"))
+        today_fund = float(kwargs.get("today_fund",0))
         is_markt = int(kwargs.get("is_markt",0))
 
         player = cm.Player.objects.filter(id=player_id).first()
@@ -296,9 +429,11 @@ def add_model(cls,**kwargs):
         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).order_by("-id").first()
+                        match_id=match_id,player_id=player_id).order_by("-stock_date").first()
         if yesterday:
             yesterday_fund = yesterday.today_fund
             yesterday_stock = yesterday.today_stock
@@ -309,37 +444,43 @@ def add_model(cls,**kwargs):
             yesterday_stock = ""
             yesterday_stock_img = "" 
             yesterday_is_markt = 0
-        obj,flag = cm.PlayerRecord.objects.get_or_create(
-                        player_id=player_id,
-                        match_id=match_id,
-                        stock_date=stock_date)
-        obj.init_fund = init_fund
-        obj.yesterday_fund = yesterday_fund
-        obj.yesterday_stock = yesterday_stock
-        obj.yesterday_stock_img = yesterday_stock_img
-        obj.today_fund = today_fund
-        obj.today_stock = today_stock
-        obj.today_stock_img = today_stock_img
-        obj.user_id = user_id
-        obj.username = username
-        obj.usercode = usercode
-        obj.match_group = match_group
-        obj.is_markt = is_markt
-        obj.yesterday_is_markt = yesterday_is_markt
-        #计算今日和昨日盈亏
-        today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
-        total_income = (today_fund - init_fund)/float(init_fund)
-        obj.today_income = round(today_income,4)
-        obj.total_income = round(total_income,4)
-        if not flag:
-            obj.ctime = datetime.datetime.now()
-        obj.save()
-        #更新排名
-        records_set = cm.PlayerRecord.objects.filter(match_id=match_id).order_by("-total_income")
-        for index,item in enumerate(records_set):
-            item.rank = index+1
-            item.save()
-        return obj.id
+        with transaction.atomic():
+            obj,flag = cm.PlayerRecord.objects.get_or_create(
+                            player_id=player_id,
+                            match_id=match_id,
+                            stock_date=stock_date)
+            obj.init_fund = init_fund
+            obj.yesterday_fund = yesterday_fund
+            obj.yesterday_stock = yesterday_stock
+            obj.yesterday_stock_img = yesterday_stock_img
+            obj.today_fund = today_fund
+            obj.today_stock = today_stock
+            obj.today_stock_img = today_stock_img
+            obj.user_id = user_id
+            obj.username = username
+            obj.usercode = usercode
+            obj.match_group = match_group
+            obj.is_markt = is_markt
+            obj.yesterday_is_markt = yesterday_is_markt
+            #计算今日和昨日盈亏
+            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)
+
+            if float(today_income)>0.4:                                                    
+                raise ce.TipException(u"今日盈利已超过40%,请仔细核对数据或直接联系副主编!")
+
+            obj.today_income = round(today_income,4)
+            obj.total_income = round(total_income,4)
+            if not flag:
+                obj.ctime = datetime.datetime.now()
+            obj.save()
+
+            #更新group_rank
+            #update_group_rank(match_id,match_group,obj.stock_date)
+            ccc.cache.lpush(settings.RANK_LIST,obj.id)
+            return obj.id
 
 
     obj = model.objects.create(**kwargs)
@@ -394,23 +535,40 @@ def get_detail_info(cls,**kwargs):
     id = kwargs.get("id")
     rst = list(model.objects.filter(id=id).values())
     rst = rst[0] if rst else {}
-    if model_name == "PlayerRecord":
-        group_income = get_group_income(rst["match_id"],rst["match_group"])
-        if rst["total_income"] in group_income:
-            group_rank = group_income.index(rst["total_income"])+1
-        else:
-            group_rank = 1
+    #if model_name == "PlayerRecord":
+    #    rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
+    #    today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
+    #    today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
+    #    rst["today_stock"] = today_stock
+    #    today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
+    #    rst["today_stock_img"] = today_stock_img
+
+    #    yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
+    #    yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
+    #    rst["yesterday_stock"] = yesterday_stock
+    #    
+    #    yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
+    #    rst["yesterday_stock_img"] = yesterday_stock_img
+
+    #    rst["today_income"] = "{}%".format(rst["today_income"]*100)
+    #    rst["total_income"] = "{}%".format(rst["total_income"]*100)
+    return rst
 
-        rst["group_rank"] = group_rank
+#@ccc.cache_data()
+def get_record_info(rcid):
+    """
+    """
+    rst = cm.PlayerRecord.objects.filter(id=rcid).values().first()
+    if rst:
         rst["match_group"] = cm.MatchGroup.objects.filter(id=rst["match_group"]).first().name
         today_stock = json.loads(rst["today_stock"]) if rst["today_stock"] else []
-        today_stock = filter(lambda x:x["fund"] and x["name"],today_stock)
+        today_stock = filter(lambda x:x["fund"] and x["name"],today_stock if today_stock else [])
         rst["today_stock"] = today_stock
         today_stock_img = json.loads(rst["today_stock_img"]) if rst["today_stock_img"] else []
         rst["today_stock_img"] = today_stock_img
 
         yesterday_stock = json.loads(rst["yesterday_stock"]) if rst["yesterday_stock"] else []
-        yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock)
+        yesterday_stock = filter(lambda x:x["fund"] and x["name"],yesterday_stock if yesterday_stock else [])
         rst["yesterday_stock"] = yesterday_stock
         
         yesterday_stock_img = json.loads(rst["yesterday_stock_img"]) if rst["yesterday_stock_img"] else []
@@ -420,6 +578,7 @@ def get_detail_info(cls,**kwargs):
         rst["total_income"] = "{}%".format(rst["total_income"]*100)
     return rst
 
+
 def get_list_info(cls,**kwargs):
     """
     """
@@ -443,7 +602,6 @@ def get_list_info(cls,**kwargs):
             for item in data:
                 user = cm.UserInfo.objects.filter(id=item["user_id"]).first()
                 match = cm.Match.objects.filter(id=item["match_id"]).first()
-                print user
                 item["username"] = user.username
                 item["usercode"] = user.usercode
                 item["match_name"] = match.name if match else ""
@@ -457,6 +615,9 @@ def get_list_info(cls,**kwargs):
 def add_player_record_single(**kwargs):
     """用户单独上传数据
     """
+    now = datetime.datetime.now()
+    if now.weekday() in [5,6] or now.strftime("%Y-%m-%d") in MISS_DATES:
+        raise ce.TipException(u"今日不能提交数据!")
     usercode = kwargs.get("usercode")
     match_id = kwargs.get("match_id")
     if not cm.Player.objects.filter(usercode=usercode,match_id=match_id).exists():
@@ -483,8 +644,10 @@ def add_player_record_single(**kwargs):
     if match.end_time < now_date:
         raise ce.TipException(u"该比赛已结束!")
 
+    #yesterday = cm.PlayerRecord.objects.filter(
+    #                match_id=match_id,player_id=player_id).order_by("-id").first()
     yesterday = cm.PlayerRecord.objects.filter(
-                    match_id=match_id,player_id=player_id).order_by("-id").first()
+                    match_id=match_id,player_id=player_id).order_by("-stock_date").first()
     if yesterday:
         yesterday_fund = yesterday.today_fund
         yesterday_stock = yesterday.today_stock
@@ -512,16 +675,20 @@ def add_player_record_single(**kwargs):
     #计算今日和昨日盈亏
     today_income = (today_fund - yesterday_fund)/float(yesterday_fund)
     total_income = (today_fund - init_fund)/float(init_fund)
+    if int(today_fund)>9999 or int(today_fund)<0:                              
+        raise ce.TipException(u"数据错误,今日净资产不能超过9999万元,不能低于0万元,请仔细核对数据!")                                                                                                                                                                       
+    if int(today_income)>2:                                                    
+        raise ce.TipException(u"数据错误,今日盈利已超过2倍,请仔细核对数据!")
     obj.today_income = round(today_income,4)
     obj.total_income = round(total_income,4)
     if not flag:
         obj.ctime = datetime.datetime.now()
     obj.save()
-    #更新排名
-    records_set = cm.PlayerRecord.objects.filter(match_id=match_id).order_by("-total_income")
-    for index,item in enumerate(records_set):
-        item.rank = index+1
-        item.save()
+
+    #更新group_rank
+    #update_group_rank(match_id,match_group,obj.stock_date)
+    ccc.cache.lpush(settings.RANK_LIST,obj.id)
+
     return obj.id
 
 
@@ -536,5 +703,19 @@ def get_single_match_info(match_id):
     return now_date,match
 
 
-
+def get_cur_record(request):
+    """
+    """
+    player = request.player
+    player_id = player.id
+    match_id = player.match_id
+    match_group = player.match_group
+    stock_date = datetime.datetime.now().strftime("%Y-%m-%d")
+    qset = cm.PlayerRecord.objects.filter(match_id=match_id,player_id=player_id,stock_date=stock_date).order_by("-stock_date")
+    data = qset.values().first() if qset else {}
+    #today_record = get_today_record(player_id,match_id,match_group,today)
+    if data:
+        data["today_stock_img"] = json.loads(data["today_stock_img"]) if data["today_stock_img"] else []
+        data["today_stock"] = json.loads(data["today_stock"]) if data["today_stock"] else []
+    return data
 

+ 2 - 0
src/weixin/urls_backstage.py

@@ -22,6 +22,8 @@ urlpatterns = [
     url(r'^stock/search$', views.StockSearchView.as_view()),
     url(r'^group/rank/list$', views.GroupRankListView.as_view()),
     url(r'^group/rank$', views.GroupRankView.as_view()),
+    url(r'^player/currecord$', views.PlayerCurRecordView.as_view()),
+    url(r'^article$', views.ArticleView.as_view()),
 
 ]
 

+ 45 - 8
src/weixin/views.py

@@ -42,7 +42,7 @@ class OpenidView(cv.BaseView):
                 return cv.to_fail(u"获取用户信息出错!")
 
 
-class UploadFileView(cv.AuthView):
+class UploadFileView(cv.BaseView):
     def post(self, request):
         """
         #文件上传(小程序)
@@ -56,6 +56,7 @@ class UploadFileView(cv.AuthView):
                 f.write(chunk)
         f.close()
         url = dest.replace(settings.STATIC_ROOT,settings.HOST)
+        print url
         return cv.to_suc({"url":url})
 
 
@@ -151,7 +152,9 @@ class PlayerRecordView(cv.AuthView):
             raise ce.TipException(mse)
         try:
             vals = ccf.get_need_params(*need_params,**qdata)
-            rst = ctl.get_detail_info(self,**vals)
+            rcid = vals.get("id")
+            #rst = ctl.get_detail_info(self,**vals)
+            rst = ctl.get_record_info(rcid)
             return cv.to_suc(rst)
         except Exception as e:
             cv.tracefail()
@@ -164,11 +167,12 @@ class PlayerRecordView(cv.AuthView):
         @today_stock:[{name:"江苏国泰",code:121221}]
         @today_stock_img:["http://test.png"]
         """
+        #return cv.to_fail(u"系统升级维护请稍后再试....")
         qdata = request.json
         player = request.player
         now = datetime.datetime.now()
-        if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
-            raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
+        #if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
+        #    raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
         need_params = ["stock_date","today_fund"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
@@ -178,7 +182,7 @@ class PlayerRecordView(cv.AuthView):
             vals = ccf.get_need_params(*need_params,**qdata)
             vals["player_id"] = player.id
             vals["match_id"] = player.match_id
-            vals["today_fund"] = round(float(vals["today_fund"]),2)
+            vals["today_fund"] = round(float(vals["today_fund"]),4)
             rst = ctl.add_model(self,**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -275,8 +279,8 @@ class PlayerRecordSingleView(cv.BaseView):
         """
         qdata = request.json
         now = datetime.datetime.now()
-        if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
-            raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
+        #if not now.isoweekday() in [1,2,3,4,5] or not "09:30"<now.strftime("%H:%S")<"15:30":
+        #    raise ce.TipException(u"只有每周一至周五 9:30 - 15:30 之间才可以提交数据!")
         need_params = ["match_id","usercode","stock_date","today_fund","today_stock_img"]
         mse = ccf.check_params(*need_params,**qdata)
         if mse:
@@ -284,7 +288,7 @@ class PlayerRecordSingleView(cv.BaseView):
         try:
             need_params.extend(["is_markt","today_stock"])
             vals = ccf.get_need_params(*need_params,**qdata)
-            vals["today_fund"] = round(float(vals["today_fund"]),2)
+            vals["today_fund"] = round(float(vals["today_fund"]),4)
             rst = ctl.add_player_record_single(**vals)
             return cv.to_suc(rst)
         except Exception as e:
@@ -305,3 +309,36 @@ class PlayerRecordSingleMatchView(cv.BaseView):
         except Exception as e:
             cv.tracefail()
             return cv.to_fail(e)
+
+
+class PlayerCurRecordView(cv.AuthView):
+    def get(self, request):
+        """#当前数据(小程序)
+        @id:1
+        """
+        qdata = request.json
+        try:
+            rst = ctl.get_cur_record(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+class ArticleView(cv.AuthView):                                                    
+    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)                                                                                                                                                                                                                                              
+

+ 4 - 4
src/weixin/wzhifuSDK.py

@@ -55,13 +55,13 @@ class WxPayConf_pub(object):
 
     ##=======【基本信息设置】=====================================
     #微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
-    APPID = "wx2938132b773c7b5a"
+    APPID = "wxb299e10e65157301"
     #JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
-    APPSECRET = "1707d86ef4d9894775ebac21d87390e6"
+    APPSECRET = "20e278a60d52ad63822a07e49931435c"
     #受理商ID,身份标识
-    MCHID = "1370781802"
+    MCHID = ""
     #商户支付密钥Key。审核通过后,在微信发送的邮件中查看
-    KEY = "ZH6191429158A498588750YFa1b2c3d4"
+    KEY = ""
 
    
 

+ 0 - 0
src/zkyuan/__init__.py


+ 0 - 0
src/zkyuan/alipay/__init__.py


+ 0 - 268
src/zkyuan/alipay/alipay.py

@@ -1,268 +0,0 @@
-#-*- coding: utf-8 -*-
-'''
-Created on 2011-4-21
-支付宝接口
-@author: Yefe
-'''
-import types
-from urllib import urlencode, urlopen
-import urllib2
-from hashcompat import md5_constructor as md5
-from config import settings
-import time
-
-def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
-    """
-    Returns a bytestring version of 's', encoded as specified in 'encoding'.
-
-    If strings_only is True, don't convert (some) non-string-like objects.
-    """
-    if strings_only and isinstance(s, (types.NoneType, int)):
-        return s
-    if not isinstance(s, basestring):
-        try:
-            return str(s)
-        except UnicodeEncodeError:
-            if isinstance(s, Exception):
-                # An Exception subclass containing non-ASCII data that doesn't
-                # know how to print itself properly. We shouldn't raise a
-                # further exception.
-                return ' '.join([smart_str(arg, encoding, strings_only,
-                        errors) for arg in s])
-            return unicode(s).encode(encoding, errors)
-    elif isinstance(s, unicode):
-        return s.encode(encoding, errors)
-    elif s and encoding != 'utf-8':
-        return s.decode('utf-8', errors).encode(encoding, errors)
-    else:
-        return s
-
-# 网关地址
-_GATEWAY = 'https://mapi.alipay.com/gateway.do?'
-
-
-# 对数组排序并除去数组中的空值和签名参数
-# 返回数组和链接串
-def params_filter(params):
-    ks = params.keys()
-    ks.sort()
-    newparams = {}
-    prestr = ''
-    for k in ks:
-        v = params[k]
-        k = smart_str(k, settings.ALIPAY_INPUT_CHARSET)
-        if k not in ('sign','sign_type') and v != '':
-            newparams[k] = smart_str(v, settings.ALIPAY_INPUT_CHARSET)
-            prestr += '%s=%s&' % (k, newparams[k])
-    prestr = prestr[:-1]
-    return newparams, prestr
-
-
-# 生成签名结果
-def build_mysign(prestr, key, sign_type = 'MD5'):
-    if sign_type == 'MD5':
-        return md5(prestr + key).hexdigest()
-    return ''
-
-
-# 即时到账交易接口
-def create_direct_pay_by_user(tn, subject, body, total_fee, bank=None,_from=None,_from_id=None):
-    params = {}
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-    params['body']          = body      # 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
-    params['notify_url']        = settings.ALIPAY_NOTIFY_URL
-    
-    params['service']       = 'create_direct_pay_by_user'
-    params['payment_type']  = '1'
-    
-    # 获取配置文件
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['seller_email']      = settings.ALIPAY_SELLER_EMAIL
-    params['return_url']        = settings.ALIPAY_RETURN_URL+"?from_type={}&from_id={}".format(_from,_from_id)
-    #print params['return_url'],88888888888888888888888888
-    
-    
-    params['show_url']          = settings.ALIPAY_SHOW_URL
-    
-    # 从订单数据中动态获取到的必填参数
-    params['out_trade_no']  = tn        # 请与贵网站订单系统中的唯一订单号匹配
-    params['subject']       = subject   # 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
-    
-    params['total_fee']     = total_fee # 订单总金额,显示在支付宝收银台里的“应付总额”里
-    
-    # 扩展功能参数——网银提前
-    #params['paymethod'] = 'directPay'   # 默认支付方式,四个值可选:bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)
-    #params['defaultbank'] = ''          # 默认网银代号,代号列表见http://club.alipay.com/read.php?tid=8681379
-    if bank:
-        params['paymethod'] = 'bankPay'
-        params['defaultbank'] = bank.upper()
-    
-    
-    # 扩展功能参数——防钓鱼
-    #params['anti_phishing_key'] = ''
-    #params['exter_invoke_ip'] = ''
-    
-    # 扩展功能参数——自定义参数
-    #params['buyer_email'] = ''
-    #params['extra_common_param'] = ''
-    
-    # 扩展功能参数——分润
-    #params['royalty_type'] = ''
-    #params['royalty_parameters'] = ''
-    
-    params,prestr = params_filter(params)
-    
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    url = _GATEWAY + urlencode(params)
-    #print url
-    return url
-
-
-# 纯担保交易接口
-def create_partner_trade_by_buyer (tn, subject, body, price):
-    params = {}
-    # 基本参数
-    params['service']       = 'create_partner_trade_by_buyer'
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-    params['notify_url']        = settings.ALIPAY_NOTIFY_URL
-    params['return_url']        = settings.ALIPAY_RETURN_URL
-
-    # 业务参数
-    params['out_trade_no']  = tn        # 请与贵网站订单系统中的唯一订单号匹配
-    params['subject']       = subject   # 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
-    params['payment_type']  = '1'
-    params['logistics_type'] = 'POST'   # 第一组物流类型
-    params['logistics_fee'] = '0.00'
-    params['logistics_payment'] = 'BUYER_PAY'
-    params['price'] = price             # 订单总金额,显示在支付宝收银台里的“应付总额”里
-    params['quantity'] = 1              # 商品的数量
-    params['seller_email']      = settings.ALIPAY_SELLER_EMAIL
-    params['body']          = body      # 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
-    params['show_url'] = settings.ALIPAY_SHOW_URL
-    
-    params,prestr = params_filter(params)
-    
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    
-    return _GATEWAY + urlencode(params)
-
-# 确认发货接口
-def send_goods_confirm_by_platform (tn):
-    params = {}
-
-    # 基本参数
-    params['service']       = 'send_goods_confirm_by_platform'
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-
-    # 业务参数
-    params['trade_no']  = tn
-    params['logistics_name'] = u'大活动网'   # 物流公司名称
-    params['transport_type'] = u'POST'
-    
-    params,prestr = params_filter(params)
-    
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    
-    return _GATEWAY + urlencode(params)
-
-def notify_verify(post):
-    # 初级验证--签名
-    _,prestr = params_filter(post)
-    #print prestr
-    mysign = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    #print mysign
-    #print post.get('sign')
-    if mysign != post.get('sign'):
-        print 'mysign is wrong' 
-        return False
-    print 'mysign = sign'
-    # 二级验证--查询支付宝服务器此条信息是否有效
-    params = {}
-    params['partner'] = settings.ALIPAY_PARTNER
-    params['notify_id'] = post.get('notify_id').encode('utf-8')
-    if settings.ALIPAY_TRANSPORT == 'https':
-        params['service'] = 'notify_verify'
-        gateway = 'https://mapi.alipay.com/gateway.do?'
-    else:
-        gateway = 'http://notify.alipay.com/trade/notify_query.do?'
-    #print urlencode(params)
-    #request = urllib2.Request(gateway,urlencode(params))
-    #veryfy_result = urllib2.urlopen(request).read()
-    veryfy_result = urllib2.urlopen(gateway+urlencode(params)).read()
-    print veryfy_result
-    if veryfy_result.lower().strip() == 'true':
-        return True
-    return False
-
-# detail_data 组装
-def assemble_batch_data(records):
-    '''
-    :param records:
-    :return: str
-        refund_records = [{'trade_no': '',
-                      'fee': 0,
-                      'reason': ''}]
-
-        trade_no 原订单号 ,支付宝系统中的订单号
-        fee 退款金额,小数点后两位
-        reason 退款原因
-    '''
-    ret = u''
-    for refund in records:
-        no = unicode(refund['trade_no'])
-        fee = unicode(refund['fee'])
-        reason = unicode(refund['reason'])
-        ret = ret + no + u'^' + fee + u'^' + reason + u'#'
-
-    return ret[:-1]
-
-# 即时到帐批量退款有密接口
-def refund_fastpay_by_platform_pwd(tn, all_refund, notify_url = None):
-    '''
-    :param tn: 退款日期(8位) + 流水号(3-24位) 不可以是000
-    :param all_refund: [{'trade_no': '', 'fee': 0, 'reason': ''}, ……]
-    :return: url
-    '''
-    params = {}
-
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-    if notify_url is None:
-        params['notify_url']    = settings.ALIPAY_NOTIFY_URL
-    else:
-        params['notify_url']    = notify_url
-
-    params['service']       = 'refund_fastpay_by_platform_pwd'
-
-    # 获取配置文件
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['seller_email']      = settings.ALIPAY_SELLER_EMAIL
-
-    # 从订单数据中动态获取到的必填参数
-    params['batch_no']          = tn        # 退款流水号
-    params['refund_date']       = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())
-
-    #
-    params['batch_num'] = len(all_refund)
-    params['detail_data'] = assemble_batch_data(all_refund)
-
-    params,prestr = params_filter(params)
-
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    url = _GATEWAY + urlencode(params)
-    #print url
-    return url
-	
-
-if __name__ == '__main__':
-    #order_number = str(int(time.time()))
-    order_number = "123456999"
-    spu_name = u'测试'
-    spu_des = u'测试'
-    totalpay = 0.1
-    print create_direct_pay_by_user(order_number,spu_name,spu_des,totalpay)

+ 0 - 254
src/zkyuan/alipay/alipay__.py

@@ -1,254 +0,0 @@
-# -*- coding: utf-8 -*-
-'''
-Created on 2011-4-21
-支付宝接口
-@author: Yefe
-'''
-import types
-from urllib import urlencode, urlopen
-import urllib2
-from hashcompat import md5_constructor as md5
-from config import settings
-import time
-
-def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
-    """
-    Returns a bytestring version of 's', encoded as specified in 'encoding'.
-
-    If strings_only is True, don't convert (some) non-string-like objects.
-    """
-    if strings_only and isinstance(s, (types.NoneType, int)):
-        return s
-    if not isinstance(s, basestring):
-        try:
-            return str(s)
-        except UnicodeEncodeError:
-            if isinstance(s, Exception):
-                # An Exception subclass containing non-ASCII data that doesn't
-                # know how to print itself properly. We shouldn't raise a
-                # further exception.
-                return ' '.join([smart_str(arg, encoding, strings_only,
-                        errors) for arg in s])
-            return unicode(s).encode(encoding, errors)
-    elif isinstance(s, unicode):
-        return s.encode(encoding, errors)
-    elif s and encoding != 'utf-8':
-        return s.decode('utf-8', errors).encode(encoding, errors)
-    else:
-        return s
-
-# 网关地址
-_GATEWAY = 'https://mapi.alipay.com/gateway.do?'
-
-
-# 对数组排序并除去数组中的空值和签名参数
-# 返回数组和链接串
-def params_filter(params):
-    ks = params.keys()
-    ks.sort()
-    newparams = {}
-    prestr = ''
-    for k in ks:
-        v = params[k]
-        k = smart_str(k, settings.ALIPAY_INPUT_CHARSET)
-        if k not in ('sign','sign_type') and v != '':
-            newparams[k] = smart_str(v, settings.ALIPAY_INPUT_CHARSET)
-            prestr += '%s=%s&' % (k, newparams[k])
-    prestr = prestr[:-1]
-    return newparams, prestr
-
-
-# 生成签名结果
-def build_mysign(prestr, key, sign_type = 'MD5'):
-    if sign_type == 'MD5':
-        return md5(prestr + key).hexdigest()
-    return ''
-
-
-# 即时到账交易接口
-def create_direct_pay_by_user(tn, subject, body, total_fee):
-    params = {}
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-    params['body']          = body      # 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
-    params['notify_url']        = settings.ALIPAY_NOTIFY_URL
-    
-    params['service']       = 'create_direct_pay_by_user'
-    params['payment_type']  = '1'
-    
-    # 获取配置文件
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['seller_email']      = settings.ALIPAY_SELLER_EMAIL
-    params['return_url']        = settings.ALIPAY_RETURN_URL
-    
-    
-    params['show_url']          = settings.ALIPAY_SHOW_URL
-    
-    # 从订单数据中动态获取到的必填参数
-    params['out_trade_no']  = tn        # 请与贵网站订单系统中的唯一订单号匹配
-    params['subject']       = subject   # 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
-    
-    params['total_fee']     = total_fee # 订单总金额,显示在支付宝收银台里的“应付总额”里
-    
-    # 扩展功能参数——网银提前
-    #params['paymethod'] = 'directPay'   # 默认支付方式,四个值可选:bankPay(网银); cartoon(卡通); directPay(余额); CASH(网点支付)
-    #params['defaultbank'] = ''          # 默认网银代号,代号列表见http://club.alipay.com/read.php?tid=8681379
-    
-    # 扩展功能参数——防钓鱼
-    #params['anti_phishing_key'] = ''
-    #params['exter_invoke_ip'] = ''
-    
-    # 扩展功能参数——自定义参数
-    #params['buyer_email'] = ''
-    #params['extra_common_param'] = ''
-    
-    # 扩展功能参数——分润
-    #params['royalty_type'] = ''
-    #params['royalty_parameters'] = ''
-    
-    params,prestr = params_filter(params)
-    
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    url = _GATEWAY + urlencode(params)
-    #print url
-    return url
-
-
-# 纯担保交易接口
-def create_partner_trade_by_buyer (tn, subject, body, price):
-    params = {}
-    # 基本参数
-    params['service']       = 'create_partner_trade_by_buyer'
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-    params['notify_url']        = settings.ALIPAY_NOTIFY_URL
-    params['return_url']        = settings.ALIPAY_RETURN_URL
-
-    # 业务参数
-    params['out_trade_no']  = tn        # 请与贵网站订单系统中的唯一订单号匹配
-    params['subject']       = subject   # 订单名称,显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。
-    params['payment_type']  = '1'
-    params['logistics_type'] = 'POST'   # 第一组物流类型
-    params['logistics_fee'] = '0.00'
-    params['logistics_payment'] = 'BUYER_PAY'
-    params['price'] = price             # 订单总金额,显示在支付宝收银台里的“应付总额”里
-    params['quantity'] = 1              # 商品的数量
-    params['seller_email']      = settings.ALIPAY_SELLER_EMAIL
-    params['body']          = body      # 订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里
-    params['show_url'] = settings.ALIPAY_SHOW_URL
-    
-    params,prestr = params_filter(params)
-    
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    
-    return _GATEWAY + urlencode(params)
-
-# 确认发货接口
-def send_goods_confirm_by_platform (tn):
-    params = {}
-
-    # 基本参数
-    params['service']       = 'send_goods_confirm_by_platform'
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-
-    # 业务参数
-    params['trade_no']  = tn
-    params['logistics_name'] = u'大活动网'   # 物流公司名称
-    params['transport_type'] = u'POST'
-    
-    params,prestr = params_filter(params)
-    
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    
-    return _GATEWAY + urlencode(params)
-
-def notify_verify(post):
-    # 初级验证--签名
-    _,prestr = params_filter(post)
-    #print prestr
-    mysign = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    #print mysign
-    #print post.get('sign')
-    if mysign != post.get('sign'):
-        print 'mysign is wrong' 
-        return False
-    print 'mysign = sign'
-    # 二级验证--查询支付宝服务器此条信息是否有效
-    params = {}
-    params['partner'] = settings.ALIPAY_PARTNER
-    params['notify_id'] = post.get('notify_id').encode('utf-8')
-    if settings.ALIPAY_TRANSPORT == 'https':
-        params['service'] = 'notify_verify'
-        gateway = 'https://mapi.alipay.com/gateway.do?'
-    else:
-        gateway = 'http://notify.alipay.com/trade/notify_query.do?'
-    #print urlencode(params)
-    #request = urllib2.Request(gateway,urlencode(params))
-    #veryfy_result = urllib2.urlopen(request).read()
-    veryfy_result = urllib2.urlopen(gateway+urlencode(params)).read()
-    print veryfy_result
-    if veryfy_result.lower().strip() == 'true':
-        return True
-    return False
-
-# detail_data 组装
-def assemble_batch_data(records):
-    '''
-    :param records:
-    :return: str
-        refund_records = [{'trade_no': '',
-                      'fee': 0,
-                      'reason': ''}]
-
-        trade_no 原订单号 ,支付宝系统中的订单号
-        fee 退款金额,小数点后两位
-        reason 退款原因
-    '''
-    ret = u''
-    for refund in records:
-        no = unicode(refund['trade_no'])
-        fee = unicode(refund['fee'])
-        reason = unicode(refund['reason'])
-        ret = ret + no + u'^' + fee + u'^' + reason + u'#'
-
-    return ret[:-1]
-
-# 即时到帐批量退款有密接口
-def refund_fastpay_by_platform_pwd(tn, all_refund, notify_url = None):
-    '''
-    :param tn: 退款日期(8位) + 流水号(3-24位) 不可以是000
-    :param all_refund: [{'trade_no': '', 'fee': 0, 'reason': ''}, ……]
-    :return: url
-    '''
-    params = {}
-
-    params['_input_charset']    = settings.ALIPAY_INPUT_CHARSET
-    if notify_url is None:
-        params['notify_url']    = settings.ALIPAY_NOTIFY_URL
-    else:
-        params['notify_url']    = notify_url
-
-    params['service']       = 'refund_fastpay_by_platform_pwd'
-
-    # 获取配置文件
-    params['partner']           = settings.ALIPAY_PARTNER
-    params['seller_email']      = settings.ALIPAY_SELLER_EMAIL
-
-    # 从订单数据中动态获取到的必填参数
-    params['batch_no']          = tn        # 退款流水号
-    params['refund_date']       = time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime())
-
-    #
-    params['batch_num'] = len(all_refund)
-    params['detail_data'] = assemble_batch_data(all_refund)
-
-    params,prestr = params_filter(params)
-
-    params['sign'] = build_mysign(prestr, settings.ALIPAY_KEY, settings.ALIPAY_SIGN_TYPE)
-    params['sign_type'] = settings.ALIPAY_SIGN_TYPE
-    url = _GATEWAY + urlencode(params)
-    #print url
-    return url

+ 0 - 216
src/zkyuan/alipay/alipay_transfer.py

@@ -1,216 +0,0 @@
-#-*- coding: utf-8 -*-
-'''
-Created on 2018-01-04
-支付宝转账接口
-@author: aslanxjc
-'''
-import json
-import time,datetime
-#from urllib import urlencode, urlopen
-#import urllib2
-import requests
-import base64
-from Crypto.PublicKey import RSA
-from Crypto.Signature import PKCS1_v1_5
-from Crypto.Hash import SHA
-from Crypto.Hash import SHA256
-from config import settings
-try:
-    from urllib import urlencode
-except:
-    from urllib.parse import urlencode
-try:
-    import urllib2
-except:
-    from urllib import request as urllib2
-
-
-class AlipayTransfer:
-    def __init__(self):
-        """支付宝转账相关
-        """
-        self.root_url = "https://openapi.alipay.com/gateway.do"
-        #self.app_id = "2088321018260401"
-        self.app_id = "2016062501553721"
-        self.version = "1.0"
-        self.charset = "utf-8"
-        self.sign_type = "RSA2"
-        #self.sign_type = "RSA"
-        self.payee_type = "ALIPAY_LOGONID"
-        self.pubkey = '''-----BEGIN PUBLIC KEY-----
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvg8jH/4mSPK3rxv8h7M4
-BWVE2Jh0dTHzcT3yT1O4q/rbDT0pIX3NcIsBWN8cBxAVvvezvlC7F+LY6utiuPeZ
-y6C921TULDBtG9vyPmuirFnkLkv6mCsurf2itVOsfK6tb/fvrrgtxeiGu4YxeOmQ
-Qaqu6JVJfebCp1nQef+2X+sPTTObd1+Ob37IGhI80tWiyj1TQ4TscYQpwOQCPVBE
-UEsrEkL46pq2Bi7X7xEIoLoUF75tYB+pSns7EVyshmydLBdCppyUcZ6uzk0SBxUt
-Y78KvDfzclHBArBQaJwr2GIZywDPdYnfXNA75tMd1OgQGcvRGcMwYZE0mIk2ouXJ
-qQIDAQAB
------END PUBLIC KEY-----'''
-        self.privkey = '''-----BEGIN RSA PRIVATE KEY-----
-MIIEpAIBAAKCAQEAvg8jH/4mSPK3rxv8h7M4BWVE2Jh0dTHzcT3yT1O4q/rbDT0p
-IX3NcIsBWN8cBxAVvvezvlC7F+LY6utiuPeZy6C921TULDBtG9vyPmuirFnkLkv6
-mCsurf2itVOsfK6tb/fvrrgtxeiGu4YxeOmQQaqu6JVJfebCp1nQef+2X+sPTTOb
-d1+Ob37IGhI80tWiyj1TQ4TscYQpwOQCPVBEUEsrEkL46pq2Bi7X7xEIoLoUF75t
-YB+pSns7EVyshmydLBdCppyUcZ6uzk0SBxUtY78KvDfzclHBArBQaJwr2GIZywDP
-dYnfXNA75tMd1OgQGcvRGcMwYZE0mIk2ouXJqQIDAQABAoIBAGHpJm063rpB4ALj
-5gp6d2fALeFvWL9vRjyWbxgSx1ZB20tMsL3CM23BDqab+bJhxPImZYCr0laR1LHh
-JXCojaBrZKNzZgKFyA/MFVW22Yz0miqHlceCp3+W5JWJT5jD3DGMhvt5gossKQy+
-KwphOKG7rnO/RKcJlEnmaRIQfAGZEVwBnzYeLCl14sMUG8S14K/o/0lMBzPHSKAS
-lOY6f8nzEzfozYvm/7xVXutNteVJ4FjbIVYtVRyWg/qMjvR/NY4dK+1uSkFD8zTJ
-kMUeLqAeIit9xQXSwBhfLoFp+AFc5FKXtk6TnlH9zYX77GbiguEaT4Skf9l2piLc
-Qb+Ln4kCgYEA479gdJLugofcFPb9I9eJK5/0VA7y3IVaFcb369R8jTyVRVIWxj/d
-LhGXUqrLQAzscHjOW9q1/HMTdbYPka/hCcrkxrQP8H8Ae0l5j8czfUzEenMH/n6y
-U4ncf0ndyOOGIB6BuMJHWvbvohWcsTxLwE7WuGl1gydMvXFQZou+i4sCgYEA1aLh
-q7WOX5pmYw8DNi7kg54C8NeGAJO38X74eE71ymySHUri9IfbVT+yFIKM5e3erBPN
-lPIzhsNE4x4PmXUnjA9kTQHdRmX59gENRooyq7hQLtLLeESuaUcnBTzT0a5ZucXC
-0uU6n+UgMPfbbnCsnacZLzOSQ551a8h/nQ/RdhsCgYEA1Je4ehkN+1rG3esQsXxo
-1wghErZBjggM53crxkA7Y7vBu0u9ZqIG3RIep1Q3Fjr6GqMqPiQS7OyepaqlLeF3
-t6RlmfZLSrvCv1L+3m+caMJYRdVLCQ1LeR+fbFKPbQ62DRVtEgKIiSko16xE8EzQ
-iVsOpGYNA7iTseMsogygebECgYBiijfXcO4T0O8LIACWPHjw8LBgkLjhiUFeJffL
-3nfm/79BvaoDqqqTnsawSSteXyLHcnbwDeuQbH9Y1yPQ38X3B553GrYK47yxKPkL
-oXEP3fs2LcrmVZ+xNb2c39rAK9B9LOfZSRyKZjA8Bgdz4IruSQYHzJzZjbyRk7Cx
-LHusIwKBgQDX0jxe1g/5VDwLRPCegT0Nx+LDmrX7QZdUOxhVvXASrRkBydpGL7TL
-YjAVIyChx4R7KpJ1GHF2q7+wZFEHua3aZRxvI381s2MBhO6mYuvaPE+mLYOlkbNr
-NlH5a/ZBljAiLFUaVt+s/kCJCYESw5eE8lzVCcEPxdL2+5uBexqzJA==
------END RSA PRIVATE KEY-----'''
-
-    def gen_timestamp(self):
-        """
-        """
-        now = datetime.datetime.now()
-        timestamp = datetime.datetime.strftime(now,"%Y-%m-%d %H:%M:%S")
-        return timestamp
-
-    def test_sign(self):
-        """测试用私钥签名
-        """
-        msg = "123456"
-        key = RSA.importKey(self.privkey)
-        h = SHA.new(msg)
-        signer = PKCS1_v1_5.new(key)
-        signature = signer.sign(h)
-        signature = base64.b64encode(signature)
-        return signature
-
-    def test_verify(self):
-        """测试用公钥验签
-        """
-        msg = "1234567"
-        key = RSA.importKey(self.pubkey)
-        h = SHA.new(msg)
-        verifier = PKCS1_v1_5.new(key)
-        ######
-        signature = self.test_sign()
-        flag = verifier.verify(h, base64.b64decode(signature))
-        print flag
-
-    def _signature(self,data):
-        """签名
-        """
-        key = RSA.importKey(self.privkey)
-        #h = SHA.new(data.encode("utf-8"))
-        h = SHA256.new(data.encode("utf-8"))
-        signer = PKCS1_v1_5.new(key)
-        signature = signer.sign(h)
-        #return signature
-        signature = base64.b64encode(signature).decode("utf-8")
-        return signature
-
-    def _verify(self,data="123456"):
-        """验签
-        """
-        key = RSA.importKey(self.pubkey)
-        h = SHA.new(data)
-        verifier = PKCS1_v1_5.new(key)
-        ######
-        signature = self.test_sign()
-        flag = verifier.verify(h, base64.b64decode(signature))
-        return flag
-
-
-    def gen_sign(self,params={}):
-        """生成签名
-        """
-        #排序组装
-        ks = params.keys()
-        ks.sort()
-        print ks,2222222222222222
-        #sortparams = {}
-        prestr = ''
-        for k in ks:
-            v = params[k]
-            #k = smart_str(k, settings.ALIPAY_INPUT_CHARSET)
-            if k not in ('sign',) and v != '':
-                prestr += '%s=%s&' % (k, params[k])
-                #prestr += '%s=%s&amp;' % (k, params[k])
-        prestr = prestr[:-1]
-        print "prestr:"
-        print prestr
-        #用商户私钥进行RSA2签名并进行BASE64编码
-        sign = self._signature(prestr)
-        return sign
-        return sortparams,prestr
-
-
-    def transfer_to_account(self,out_biz_no,payee_account,amount):
-        """转账到单个支付宝账号接口
-        """
-        method = "alipay.fund.trans.toaccount.transfer"
-        sys_params = {
-                "app_id":self.app_id, 
-                "method":method, 
-                "charset":self.charset, 
-                "sign_type":self.sign_type, 
-                "timestamp":self.gen_timestamp(), 
-                "version":self.version, 
-                #"biz_content":"test", 
-            }
-        req_params = {
-                "out_biz_no":out_biz_no, 
-                "payee_type":self.payee_type, 
-                "payee_account":payee_account, 
-                "amount":amount, 
-            }
-        sys_params.update({"biz_content":json.dumps(req_params)})
-
-        params = sys_params.copy()
-        params.update(req_params)
-
-        sign = self.gen_sign(params)
-        print "sign:"
-        print sign
-        sys_params.update({"sign":sign})
-        print sys_params,1111111111111111
-        querys = urlencode(sys_params)
-        print req_params,22222222222222222
-        post_data = urlencode(req_params)
-        url = "{0}?{1}".format(self.root_url, querys)
-        #response = urllib2.urlopen(url, post_data).read().decode("utf-8")
-        #response = urllib2.urlopen(url, post_data)
-        try:
-            response = requests.post(url,data=req_params)
-            rsp = response.json().get("alipay_fund_trans_toaccount_transfer_response")
-            print rsp,11111111111111111111111111
-            code = rsp.get("code")
-            if code == "10000":
-                order_id = rsp.get("order_id")
-                out_biz_no = rsp.get("out_biz_no")
-                return (order_id,out_biz_no)
-            else:
-                return False
-        except:
-            return False
-
-
-
-if __name__ == "__main__":
-    alipay_transfer = AlipayTransfer()
-    #alipay_transfer.test_encrypt_decrypt()
-    #alipay_transfer.test_verify()
-
-    ###################
-    out_biz_no = str(int(time.time()))
-    payee_account = "15982456282"
-    amount = 0.1 
-    alipay_transfer.transfer_to_account(out_biz_no,payee_account,amount)
-        

+ 0 - 33
src/zkyuan/alipay/config.py

@@ -1,33 +0,0 @@
-#-*- coding:utf-8 -*-
-rootUrl = 'http://www.zhenlaoxiang.com/'
-class settings:
-  # 安全检验码,以数字和字母组成的32位字符
-  #ALIPAY_KEY = 'c9yi617kzso8gg4wwfuxi7kofb9ppgdd'
-  ALIPAY_KEY = 'gil116tlfn1u3yo0e36lupsx6vgrw9kd'
-
-  ALIPAY_INPUT_CHARSET = 'utf-8'
-
-  # 合作身份者ID,以2088开头的16位纯数字
-  #ALIPAY_PARTNER = '2088221719272320'
-  ALIPAY_PARTNER = '2088931591400303'
-
-  # 签约支付宝账号或卖家支付宝帐户
-  #ALIPAY_SELLER_EMAIL = 'saishi@siyusai.com'
-  ALIPAY_SELLER_EMAIL = 'zlxzdhx@163.com'
-
-  ALIPAY_SIGN_TYPE = 'MD5'
-
-  # 付完款后跳转的页面(同步通知) 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
-  ALIPAY_RETURN_URL=rootUrl+'alipay/return_url/'
-  ALIPAY_RETURN_URL='http://xydapi.tederen.com/#/mall/success'
-
-  # 交易过程中服务器异步通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
-  ALIPAY_NOTIFY_URL=rootUrl+'alipay/notify_url/'
-  #ALIPAY_NOTIFY_URL='http://115.28.186.27:12005/common/alipay/notify_url/'
-  ALIPAY_NOTIFY_URL='http://www.zhenlaoxing.com/common/alipay/notify_url/'
-
-  ALIPAY_SHOW_URL='www.zhenlaoxing.com'
-
-  # 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
-  ALIPAY_TRANSPORT='http'
-  

+ 0 - 27
src/zkyuan/alipay/config.py.bk

@@ -1,27 +0,0 @@
-#-*- coding:utf-8 -*-
-rootUrl = 'http://www.ai9bang.com/'
-class settings:
-  # 安全检验码,以数字和字母组成的32位字符
-  ALIPAY_KEY = '8fxswqef7aq55cujdv1fef1a5bcd8frh'
-
-  ALIPAY_INPUT_CHARSET = 'utf-8'
-
-  # 合作身份者ID,以2088开头的16位纯数字
-  ALIPAY_PARTNER = '2088702352318180'
-
-  # 签约支付宝账号或卖家支付宝帐户
-  ALIPAY_SELLER_EMAIL = '18780056325'
-
-  ALIPAY_SIGN_TYPE = 'MD5'
-
-  # 付完款后跳转的页面(同步通知) 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
-  ALIPAY_RETURN_URL=rootUrl+'return_url/'
-
-  # 交易过程中服务器异步通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
-  ALIPAY_NOTIFY_URL=rootUrl+'notify_url/'
-
-  ALIPAY_SHOW_URL='www.ai9bang.com'
-
-  # 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
-  ALIPAY_TRANSPORT='http'
-  

+ 0 - 32
src/zkyuan/alipay/config_transfer.py

@@ -1,32 +0,0 @@
-#-*- coding:utf-8 -*-
-rootUrl = 'http://xydapi.tederen.com/'
-class settings:
-  # 安全检验码,以数字和字母组成的32位字符
-  #ALIPAY_KEY = 'c9yi617kzso8gg4wwfuxi7kofb9ppgdd'
-  ALIPAY_KEY = 'yhfme9yh6w9mmoxvcpmo53f1xx49pxi0'
-
-  ALIPAY_INPUT_CHARSET = 'utf-8'
-
-  # 合作身份者ID,以2088开头的16位纯数字
-  #ALIPAY_PARTNER = '2088221719272320'
-  ALIPAY_PARTNER = '2088321018260401'
-
-  # 签约支付宝账号或卖家支付宝帐户
-  #ALIPAY_SELLER_EMAIL = 'saishi@siyusai.com'
-  ALIPAY_SELLER_EMAIL = 'donlee213@outlook.com'
-
-  ALIPAY_SIGN_TYPE = 'MD5'
-
-  # 付完款后跳转的页面(同步通知) 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
-  ALIPAY_RETURN_URL=rootUrl+'alipay/return_url/'
-  ALIPAY_RETURN_URL='http://xydapi.tederen.com/#/mall/success'
-
-  # 交易过程中服务器异步通知的页面 要用 http://格式的完整路径,不允许加?id=123这类自定义参数
-  ALIPAY_NOTIFY_URL=rootUrl+'alipay/notify_url/'
-  ALIPAY_NOTIFY_URL='http://115.28.186.27:12005/common/alipay/notify_url/'
-
-  ALIPAY_SHOW_URL='test.tederen.com'
-
-  # 访问模式,根据自己的服务器是否支持ssl访问,若支持请选择https;若不支持请选择http
-  ALIPAY_TRANSPORT='http'
-  

+ 0 - 20
src/zkyuan/alipay/hashcompat.py

@@ -1,20 +0,0 @@
-"""
-The md5 and sha modules are deprecated since Python 2.5, replaced by the
-hashlib module containing both hash algorithms. Here, we provide a common
-interface to the md5 and sha constructors, preferring the hashlib module when
-available.
-"""
-
-try:
-    import hashlib
-    md5_constructor = hashlib.md5
-    md5_hmac = md5_constructor
-    sha_constructor = hashlib.sha1
-    sha_hmac = sha_constructor
-except ImportError:
-    import md5
-    md5_constructor = md5.new
-    md5_hmac = md5
-    import sha
-    sha_constructor = sha.new
-    sha_hmac = sha

+ 0 - 41
src/zkyuan/alipay/rsa2key/format_key.py

@@ -1,41 +0,0 @@
-#-*-coding:utf-8 -*-
-
-def get_pubkey():
-    """
-    """
-    with open("pubkey.txt","r") as f:
-        pubkey = f.read()
-        print len(pubkey),2222222222222222
-        ind_list = filter(lambda x:x%64==0,[i for i in range(0,len(pubkey))])
-        ind_range = [[x,x+64] if x+64<len(pubkey) else [x,-1] for x in ind_list]
-        print pubkey
-        print ind_list
-        print ind_range
-        str_range = [pubkey[x:x+64] if x+64<len(pubkey) else pubkey[x:] for x in ind_list]
-        print str_range
-        format_str = "\n".join(str_range)
-        format_str = "-----BEGIN PUBLIC KEY-----\n"+format_str+"\n-----END PUBLIC KEY-----"
-        print format_str
-
-
-def get_privkey():
-    """
-    """
-    with open("privkey.txt","r") as f:
-        pubkey = f.read()
-        print len(pubkey),2222222222222222
-        ind_list = filter(lambda x:x%64==0,[i for i in range(0,len(pubkey))])
-        ind_range = [[x,x+64] if x+64<len(pubkey) else [x,-1] for x in ind_list]
-        print pubkey
-        print ind_list
-        print ind_range
-        str_range = [pubkey[x:x+64] if x+64<len(pubkey) else pubkey[x:] for x in ind_list]
-        print str_range
-        format_str = "\n".join(str_range)
-        format_str = "-----BEGIN RSA PRIVATE KEY-----\n"+format_str+"\n-----END RSA PRIVATE KEY-----"
-        print format_str
-
-
-if __name__ == "__main__":
-    get_pubkey()
-    #get_privkey()

File diff suppressed because it is too large
+ 0 - 1
src/zkyuan/alipay/rsa2key/privkey.txt


+ 0 - 1
src/zkyuan/alipay/rsa2key/pubkey.txt

@@ -1 +0,0 @@
-MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvg8jH/4mSPK3rxv8h7M4BWVE2Jh0dTHzcT3yT1O4q/rbDT0pIX3NcIsBWN8cBxAVvvezvlC7F+LY6utiuPeZy6C921TULDBtG9vyPmuirFnkLkv6mCsurf2itVOsfK6tb/fvrrgtxeiGu4YxeOmQQaqu6JVJfebCp1nQef+2X+sPTTObd1+Ob37IGhI80tWiyj1TQ4TscYQpwOQCPVBEUEsrEkL46pq2Bi7X7xEIoLoUF75tYB+pSns7EVyshmydLBdCppyUcZ6uzk0SBxUtY78KvDfzclHBArBQaJwr2GIZywDPdYnfXNA75tMd1OgQGcvRGcMwYZE0mIk2ouXJqQIDAQAB

+ 0 - 78
src/zkyuan/cauth.py

@@ -1,78 +0,0 @@
-#coding=utf-8
-import logging
-import datetime
-
-import account.password_handle as ph
-from django.db.models import Q
-
-import common.error_info as ctc
-import common.models as am
-import account.lock_account as la
-
-logger = logging.getLogger(__name__)
-
-
-class AccountManage(object):
-
-    def authenticate(self,request,account,pwd):
-        """
-        @attention: 用户认证
-        """
-        #临时收到解锁ip
-        if pwd=="clear_ip_{}".format(account) :
-            la.clear_lock(0,request.ip)
-
-        if la.is_lock_ip(request.ip):
-            raise ctc.TipException(u'密码连续输错20次,锁定ip半个小时!')
-
-        user = am.UserInfo.objects.filter(Q(name=account)).first()
-        if user is not None:
-            #临时收到解锁ip
-            if pwd=="clear_account_{}".format(account) :
-                la.clear_lock(user.id,0)
-            if self.user_can_authenticate(user):
-                if la.is_lock(user.id, request.ip)=="ip_lock":
-                    raise ctc.TipException(u'密码连续输错20次,锁定ip半个小时!')
-                if la.is_lock(user.id, request.ip)=="account_lock":
-                    #记录ip错误
-                    la.increase_error_count_ip(request.ip)
-                    raise ctc.TipException(u'密码连续输错5次,锁定用户10分钟!')
-                if ph.check_password(pwd, user.password):
-                    la.clear_lock_count(user.id, request.ip)
-                    return user
-                else:
-                    logger.info("account, pwd %s", 'login failed')
-                    #记录ip错误
-                    la.increase_error_count_ip(request.ip)
-                    #记录用户名错误
-                    la.increase_error_count_uid(user.id)
-                    raise ctc.TipException("账号或密码错误")
-            else:
-                raise ctc.TipException("账户已停用")
-        else:
-            #记录ip错误
-            la.increase_error_count_ip(request.ip)
-            raise ctc.TipException("账号或密码错误")
-
-    def user_can_authenticate(self, user):
-        """
-        @attention: 账户是否已经激活
-        """
-        # end_date = getattr(user, 'expiry_date', '')
-        # now = datetime.datetime.now().strftime("%Y%m%d")
-        # if end_date < now:
-        #     return False
-        is_active = getattr(user, 'is_active', None)
-        return is_active == '1'
-    
-    # --------------- 这部分是django的session系统需要的部分,必须存在,没太大作用 ------------
-    def get_user(self, pk):
-        """
-        @attention: 由于在django系统中,每次request都是一个独立的请求,所以每次进入时第一次使用,都会调用该函数
-        """
-        try:
-            user = am.UserInfo.objects.get(pk=pk)
-        except am.UserInfo.DoesNotExist:
-            return None
-        return user
-

+ 0 - 97
src/zkyuan/control_bankcard.py

@@ -1,97 +0,0 @@
-#coding=utf-8
-'''
-'''
-import json
-from django.db import transaction
-import common.models as cm
-import common.error_info as ce
-import common.common_functions as ccf
-import common.common_control as ccc
-
-def add_bankcard(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["name","cardno"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    cvals["user_id"] = request.user.id
-    cvals["cid"] = request.user.id
-    cvals["cperson"] = request.user.realname
-    try:
-        obj = cm.BankCard.objects.create(**cvals)
-    except Exception as e:
-        raise ce.TipException(str(e))
-
-
-def update_bankcard(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    id = kwargs.get("id")
-    need_params.extend(["name","cardno"])
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    try:
-        cm.BankCard.objects.filter(id=id).update(**cvals)
-    except Exception as e:
-        raise ce.TipException(str(e))
-
-def delete_bankcard(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    ids = str(kwargs.get("id")).split(",")
-    cm.BankCard.objects.filter(id__in=ids).update(status=0)
-
-
-def get_bankcard_list(request):
-    """
-    """
-    kwargs = request.json
-    eset = cm.BankCard.objects.filter(status=1,user_id=request.user.id)
-    total = eset.count()
-    edata = list(eset.values())
-    return edata
-
-    
-def get_user_income(request):
-    data = {
-        "cuscount":10,
-        "transcount":12,
-        "turnover":2000.00,
-        "income":2000.00
-        }
-    return data
-
-
-def apply_cash(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["bankcard_id","cashtype","cashamount"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    cvals["cid"] = request.user.id
-    cvals["cperson"] = request.user.realname
-    try:
-        obj = cm.CashRecord.objects.create(**cvals)
-    except Exception as e:
-        raise ce.TipException(str(e))
-
-
-
-

+ 0 - 81
src/zkyuan/control_department.py

@@ -1,81 +0,0 @@
-#coding=utf-8
-'''
-'''
-import json
-from django.db import transaction
-import common.models as cm
-import common.error_info as ce
-import common.common_functions as ccf
-import common.common_control as ccc
-
-def add_department(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["name","permissions"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    if kwargs.get("pid"):
-        cvals["pid"] = kwargs.get("pid")
-    cvals["cid"] = request.user.id
-    cvals["cperson"] = request.user.realname
-    try:
-        obj = cm.Department.objects.create(**cvals)
-    except Exception as e:
-        raise c.TipException(str(e))
-
-
-def update_department(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    id = kwargs.get("id")
-    need_params.extend(["name","pid","permissions"])
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    if kwargs.get("pid"):
-        cvals["pid"] = kwargs.get("pid")
-    cvals["cid"] = request.user.id
-    cvals["cperson"] = request.user.realname
-    try:
-        cm.Department.objects.filter(id=id).update(**cvals)
-    except Exception as e:
-        raise c.TipException(str(e))
-
-def delete_department(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    ids = str(kwargs.get("id")).split(",")
-    cm.Department.objects.filter(id__in=ids).update(status=0)
-
-
-def get_department_list(request):
-    """
-    """
-    kwargs = request.json
-    eset = cm.Department.objects.filter(status=1)
-    if "name" in kwargs and kwargs.get("name"):
-        eset = eset.filter(name__icontains=kwargs.get("name"))
-    total = eset.count()
-    edata = list(eset.values())
-    page = int(kwargs.get("page",1))
-    page_size = int(kwargs.get("page_size",20))
-    total,data = ccf.get_page_list(edata,page,page_size)
-    return (total,data)
-
-    
-
-
-
-

+ 0 - 129
src/zkyuan/control_organization.py

@@ -1,129 +0,0 @@
-#coding=utf-8
-'''
-'''
-import json
-from django.db.models import Q
-from django.db import transaction
-import common.models as cm
-import common.common_functions as ccf
-import common.common_control as ccc
-import common.error_info as ce
-
-
-def search_organization(name):
-    """
-    """
-    qset = cm.Organization.objects.filter(name__icontains=name)
-    qdata = list(qset.values_list("name",flat=True))
-    return qdata
-
-def get_organization_tree(uid):
-    """
-    """
-    user = cm.UserInfo.objects.filter(pk=uid).first()
-    if not user:
-        raise ce.TipException(u"用户不存在")
-    uid = user.pk
-
-    total,users_info = ccc.get_sub_users(uid)
-    print users_info
-    user_ids = [x["id"] for x in users_info]
-    permissions = list(user.role.permission.all().values_list("codename",flat=True))
-
-    if user.role.platform == "portal":
-        #数据权限下用户所在的企业
-        org_ids = list(cm.UserInfo.objects.filter(id__in=user_ids).values_list("organization_id",flat=True))
-        #数据权限下的用户创建的企业
-        for uid in user_ids:
-            _user = cm.UserInfo.objects.filter(id=uid).first()
-            if "SystemManagement.Organization.Check" in permissions:
-                org_ids_created = list(cm.Organization.objects.filter(cid__in=[uid]).values_list("id",flat=True))
-                org_ids.extend(org_ids_created)
-        #orgs = cm.Organization.objects.filter(id__in=org_ids)
-        orgs = cm.Organization.objects.filter(id__in=org_ids,cid=uid).exclude(pid__in=org_ids)
-    else:
-        print 6666666666666666
-        orgs = cm.Organization.objects.filter(cid__in=user_ids)
-
-    org_ids = list(orgs.values_list("id",flat=True))
-    print org_ids,9999
-    #组装树结构
-    trees = []
-    for org in orgs:
-        if user.role.platform == "portal":
-            trees.append(ccc.get_sub_organization_tree(org.id))
-        else:
-            if not org.pid:
-                trees.append(ccc.get_sub_organization_tree(org.id))
-
-    otree = [
-        {
-            "id":1,
-            "nodes":[
-                {
-                    "id":2,
-                    "nodes":[
-                    
-                    ],
-                    "tree_label":u"成都代理运营中心"
-                } 
-            ],
-            "tree_label":u"成都运营中心"
-        } 
-    ]
-    return trees
-
-
-def add_organization(**kwargs):
-    """
-    """
-    need_params = ["name","sname"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    need_params.extend(["pid","cid","cperson","desc"])
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    with transaction.atomic():
-        oobj = cm.Organization.objects.create(**cvals)
-
-
-def update_organization(**kwargs):
-    """
-    """
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    id = kwargs.get("id")
-    uvals = {}
-    if "name" in kwargs:
-        uvals["name"] = kwargs.get("name")
-    if "sname" in kwargs:
-        uvals["sname"] = kwargs.get("sname")
-    if "desc" in kwargs:
-        uvals["desc"] = kwargs.get("desc")
-
-    with transaction.atomic():
-        oobj = cm.Organization.objects.filter(id=id).update(**uvals)
-
-
-def delete_organization(**kwargs):
-    """
-    """
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    ids = str(kwargs.get("id")).split(",")
-    cm.Organization.objects.filter(id__in=ids).delete()
-    
-    #级联删除相关联数据待完善...
-
-
-def get_organization_info(*ids):
-    """
-    """
-    qset = cm.Organization.objects.filter(id__in=ids)
-    oinfo = list(qset.values("id","name","sname","desc","pid"))
-    return oinfo
-

+ 0 - 36
src/zkyuan/control_permission.py

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

+ 0 - 106
src/zkyuan/control_role.py

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

+ 0 - 240
src/zkyuan/control_user.py

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

+ 0 - 711
src/zkyuan/controls.py

@@ -1,711 +0,0 @@
-#coding=utf-8
-'''
-'''
-import random
-import os,re
-import json,time,datetime
-import shutil
-import tempfile
-import zipfile
-from docxtpl import DocxTemplate,InlineImage
-from docx.shared import Mm
-from django.db import transaction
-from django.conf import settings
-import common.models as cm
-import common.error_info as ce
-import common.common_functions as ccf
-import common.common_control as ccc
-from utils.exceltool import ExcelTool
-from utils.exceltool import ExcelTool
-from utils.aestool import aescbc
-from django.db.models import Q
-from PIL import Image
-from PIL import Image,ImageDraw,ImageFont
-from .wxqrcodepay import getQrcodeUrl
-from utils.qrcodetool import gen_general_qrcode
-import wzhifuSDK as wxpay
-
-import xlrd
-import xlwt
-from xlutils.copy import copy
-from xltpl.writer import BookWriter
-from copy import deepcopy
-from utils.aliyun_sms import *
-
-
-
-def add_model(cls,**kwargs):
-    """
-    """
-    model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
-    model = getattr(cm,model_name)
-    obj = model.objects.create(**kwargs)
-    return obj.id
-
-def update_model(cls,**kwargs):
-    """
-    """
-    model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
-    model = getattr(cm,model_name)
-    id = kwargs.pop("id")
-    rst = model.objects.filter(id=id).update(**kwargs)
-    return rst
-
-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()
-    return ids
-
-def get_detail_info(cls,**kwargs):
-    """
-    """
-    model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
-    model = getattr(cm,model_name)
-    id = kwargs.get("id")
-    rst = list(model.objects.filter(id=id).values())
-    rst = rst[0] if rst else {}
-    if model_name == "Goverment":
-        gov = cm.Goverment.objects.filter(id=rst["id"]).first()
-        enterprise = list(gov.enterprise.all().values("id","name")) if gov.enterprise else []
-        rst["enterprise"] = enterprise
-    return rst
-
-def get_list_info(cls,**kwargs):
-    """
-    """
-    model_name = re.search(r'.*\.(\w+)ListView',str(cls.__class__)).groups()[0]
-    model = getattr(cm,model_name)
-    qset = model.objects.all()
-    if kwargs.get("name"):
-        qset = qset.filter(name__icontains=kwargs.get("name"))
-    data = list(qset.values())
-    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)
-        return (total,data)
-    else:
-        return len(data),data
-
-    return rst
-
-
-def get_sub_cats(pid):
-    """
-    """
-    qset = cm.Category.objects.filter(parent_id=pid)
-    qdata = list(qset.values())
-    if qdata:
-        for subitem in qdata:
-            subitem["children"] = get_sub_cats(subitem["id"])
-    return qdata
-
-def get_sub_citys(pid):
-    """
-    """
-    qset = cm.City.objects.filter(parent_id=pid)
-    qdata = list(qset.values())
-    if qdata:
-        for subitem in qdata:
-            subitem["text"] = subitem["name"]
-            subitem["value"] = str(subitem["id"])
-            subitem["children"] = get_sub_citys(subitem["id"])
-    return qdata
-
-@ccc.cache_data()
-def get_sub_cat_ids(pid,data=None):
-    data = data if data else [pid]
-    for c in cm.Category.objects.filter(parent_id=pid):
-        data.append(c.id)
-        get_sub_cat_ids(c.id,data)
-    return data
-
-
-def login_user(request):
-    """
-    """
-    info = request.json
-    username = info.get('username')
-    password = info.get('pwd')
-    if not username or not password:
-        raise ce.TipException(u"账户或密码不能为空!")
-
-    user = cm.UserInfo.objects.filter(Q(name=username)|Q(phone=username)).first()
-    if user:
-        if user.password != ccf.make_password(password):
-            raise ce.TipException(u"账号或密码错误!")
-        request.session["user"] = {"id":user.id,"name":user.name,"realname":user.realname}
-    else:
-        raise ce.TipException(u"用户不存在!")
-
-def regist_user(request):
-    """
-    """
-    info = request.json
-    regimgcode = request.session.get("regimgcode")
-    username = info.get('username')
-    password = info.get('pwd')
-    repassword = info.get('repwd')
-    phone = info.get('mobile')
-    vcode = info.get('vcode')
-    if not username or not password:
-        raise ce.TipException(u"账户或密码不能为空!")
-    if password != repassword:
-        raise ce.TipException(u"两次输入的密码不一致!")
-
-    if cm.UserInfo.objects.filter(name=username).exists():
-        raise ce.TipException(u'用户名:{}已存在!'.format(username))
-    if cm.UserInfo.objects.filter(phone=phone).exists():
-        raise ce.TipException(u'该手机号:{}已经注册过!'.format(phone))
-    #if regimgcode.lower() != vcode.lower():
-    #    raise ce.TipException(u"验证码不正确!")
-    obj = cm.UserInfo.objects.create(name=username,
-        password=ccf.make_password(password),phone=phone)
-    return obj
-
-def find_city_roots(city_id,data=None):
-    """
-    """
-    data = data if data else [city_id]
-    parent = cm.City.objects.filter(id=city_id).first()
-    parent_id = parent.parent_id if parent else 0
-    if parent_id:
-        data.insert(0,parent_id)
-        find_city_roots(parent_id,data)
-    return data
-
-@ccc.cache_data()
-def get_index_citys():
-    city_qset = cm.City.objects.filter(parent_id__isnull=True)
-    citys = list(city_qset.values())
-    for ct in citys:
-        ct["path"] = "/list/0/"+str(ct["id"])
-    citys = [{"name":u"全国","path":"/","cur_flag":1}]+citys
-    return citys
-
-@ccc.cache_data()
-#@ccc.no_cache()
-def get_index_cats():
-    catset = cm.Category.objects.filter(parent_id__isnull=True)
-    cats = list(catset.values())
-    for cat in cats:
-        cat["children"] = get_sub_cats(cat["id"])
-    return cats
-
-@ccc.cache_data()
-def get_citys_data():
-    catset = cm.City.objects.filter(parent_id__isnull=True)
-    cats = list(catset.values())
-    for cat in cats:
-        cat["text"] = cat["name"]
-        cat["value"] = str(cat["id"])
-        cat["children"] = get_sub_citys(cat["id"])
-    return cats
-
-#@ccc.cache_data()
-def get_index_data():
-    """首页数据接口
-    """
-    ret = {}
-
-    #城市数据
-    citys = get_index_citys()
-    ret["citys"] = citys
-
-    ##首页分类数据
-    cats = get_index_cats()
-    ret["cats"] = cats
-
-    #首页banner广告
-    bannerset = cm.AdvertiseMent.objects.filter(position=1)
-    banners = list(bannerset.values())
-    ret["banners"] = banners
-
-    #首页公告
-    notice = cm.News.objects.filter(newscategory=u"公告")[:10]
-    notice = list(notice.values())
-    ret["notice"] = notice
-
-    #首页推荐位广告
-    adset = cm.AdvertiseMent.objects.filter(position=2)
-    ads = list(adset.values())
-    ret["ads"] = ads
-
-    #首页上部商品推荐
-    rec_goods = cm.Goods.objects.all()[:10]
-    ret["rec_goods"] = list(rec_goods.values())
-
-    #首页商品及商家推荐
-    recommands = []
-    rec_cats = deepcopy(cats)
-    for cat in rec_cats:
-        tmp = {}
-        cats = cat
-        sub_cat_ids = get_sub_cat_ids(cat["id"])
-        sub_cats = list(cm.Category.objects.filter(id__in=sub_cat_ids).values("id","name"))[:9]
-        cats["children"] = sub_cats
-        goods = list(cm.Goods.objects.filter(category_id__in=sub_cat_ids).values("id","name","price","img"))[:6]
-        shops = list(cm.Shop.objects.filter(category_id__in=sub_cat_ids).values())[:5]
-        tmp["cats"] = cats
-        tmp["goods"] = goods
-        tmp["shops"] = shops
-        recommands.append(tmp)
-    ret["recommands"] = recommands
-    return ret
-
-def get_list_data(request,cat=None,city=None):
-    """
-    """
-    ret = {}
-    if city and int(city):
-        pre_city_ids = find_city_roots(city,[])
-        pre_citys = list(cm.City.objects.filter(id__in=pre_city_ids).values())
-        for rct in pre_citys:
-            rct["path"] = "/list/{}/{}".format(cat,str(rct["id"]))
-            if int(rct["id"]) == int(city):
-                rct["cur_flag"] = 1
-        city_qset = cm.City.objects.filter(parent_id=city)
-        citys = list(city_qset.values())
-        for ct in citys:
-            ct["path"] = "/list/{}/{}".format(cat,str(ct["id"]))
-        #将当前city的父级前置
-        citys = [{"name":u"全国","path":"/"}]+pre_citys + citys
-    else:
-        city_qset = cm.City.objects.filter(parent_id__isnull=True)
-        citys = list(city_qset.values())
-        for ct in citys:
-            ct["path"] = "/list/{}/{}".format(cat,str(ct["id"]))
-        citys = list(city_qset.values())
-        #将当前city的父级前置
-        citys = [{"name":u"全国","path":"/","cur_flag":1}]+ citys
-
-    ret["citys"] = citys
-    return ret
-
-def format_shop(ids):
-    """
-    """
-    shopset = cm.Shop.objects.filter(id__in=ids)
-    shops = list(shopset.values())
-    return shops
-
-def format_goods(ids):
-    """
-    """
-    goods_set = cm.Goods.objects.filter(id__in=ids)
-    goods = list(goods_set.values())
-    for good in goods:
-        good["imgs"] = json.loads(good["imgs"]) if good["imgs"] else []
-        good["shop"] = format_shop([good["shop_id"]])[0]
-    return goods
-
-def format_news(ids):
-    newset = cm.News.objects.filter(id__in=ids)
-    news = list(newset.values())
-    return news
-
-def get_goods_info(id):
-    """获取商品详情
-    """
-    ret = {}
-    #商品信息
-    gds = format_goods([id])[0]
-    shop_id = gds["shop_id"]
-    shopinfo = format_shop([shop_id])[0]
-    ret["shopinfo"] = shopinfo
-    ret["goods"] = gds
-    #同类商品推荐
-    category_id = gds["category_id"]
-    sub_cat_ids = get_sub_cat_ids(category_id)
-    recommands = list(cm.Goods.objects.filter(category_id__in=sub_cat_ids).values())[:5]
-    ret["recommands"] = recommands
-    return ret
-
-def get_goods_list():
-    """获取商品详情
-    """
-    goods = list(cm.Goods.objects.all().values())
-    return goods
-
-def get_shop_info(shopid):
-    """
-    """
-    shopinfo = format_shop([shopid])[0]
-    return shopinfo
-
-def get_shop_banners(shopid):
-    """
-    """
-    banners = list(cm.ShopBanners.objects.filter(shopid=shopid).values())
-    return banners
-
-def get_shop_recgoods(shopid):
-    """商家推荐产品
-    """
-    rec_goods = list(cm.Goods.objects.filter(shop_id=shopid).values())
-    return rec_goods
-
-
-def get_shop_goods(shopid):
-    goods = list(cm.Goods.objects.filter(shop_id=shopid).order_by("-id").values())
-    return goods
-
-def get_shop_news(shopid,news_name):
-    """
-    """
-    if str(news_name).isdigit():
-        shop_news = list(cm.News.objects.filter(shop_id=shopid)\
-            .filter(Q(newscategory_id=news_name)).values())
-    else:
-        shop_news = list(cm.News.objects.filter(shop_id=shopid)\
-            .filter(Q(newscategory=news_name)).values())
-    return shop_news
-
-def get_news_info(id):
-    """
-    """
-    news = format_news([id])[0]
-    return news
-
-def get_shop_navs(shopid):
-    shop = cm.Shop.objects.get(id=shopid)
-    navs = list(shop.newscategory.all().values())
-    for nav in navs:
-        if nav["type"] == "nl":
-            nav["path"] = "/shop{}/news/list/{}".format(shopid,nav["id"])
-        else:
-            news = cm.News.objects.filter(newscategory_id=nav["id"]).first()
-            if news:
-                nav["path"] = "/shop{}/news/{}.html".format(shopid,news.id)
-            else:
-                nav["path"] = "/shop{}/news/list/{}".format(shopid,nav["id"])
-    return navs
-
-def get_news_list(cat):
-    """
-    """
-    ret = {}
-    ret["newscategory_id"] = cat
-    ret["newscategory"] = cm.NewsCategory.objects.get(id=cat).name
-    newset = cm.News.objects.filter(newscategory_id=cat)
-    news = list(newset.values())
-    ret["list"] = news
-    #推荐新闻
-    rec_news = list(cm.News.objects.filter(newscategory_id=3).values())
-    ret["rec_news"] = rec_news
-    return ret
-
-def manage_shopcar(request):
-    """
-    """
-    user_id = request.session.get("user")["id"]
-    id = request.GET.get("id")
-    act = request.GET.get("act")
-    amount = request.GET.get("amt")
-    if act == "new":
-        if not id:
-            raise ce.TipException(u"参数错误!")
-        goods = cm.Goods.objects.get(id=id)
-        goods_name = goods.name
-        goods_img = goods.img
-        goods_price = goods.price
-        shop_id = goods.shop_id
-        shop_name = goods.shop_name
-        obj = cm.ShopCar.objects.create(
-            user_id = user_id, 
-            goods_id = id, 
-            goods_name = goods_name, 
-            goods_img = goods_img, 
-            price = goods_price, 
-            amount = amount, 
-            shop_id = shop_id, 
-            shop_name = shop_name 
-        )
-    if act == "anum":
-        if not id:
-            raise ce.TipException(u"参数错误!")
-        shopcar = cm.ShopCar.objects.get(id=id)
-        shopcar.amount = shopcar.amount + 1
-        shopcar.save()
-    if act == "dnum":
-        if not id:
-            raise ce.TipException(u"参数错误!")
-        shopcar = cm.ShopCar.objects.get(id=id)
-        if shopcar.amount > 1:
-            shopcar.amount = shopcar.amount - 1
-        shopcar.save()
-
-    if act == "del":
-        if not id:
-            raise ce.TipException(u"参数错误!")
-        cm.ShopCar.objects.filter(id=id).delete()
-
-def get_user_shopcars(request):
-    """
-    """
-    user_id = request.session.get("user")["id"]
-    shopcarset = cm.ShopCar.objects.filter(user_id=user_id,order_id__isnull=True)
-    if request.GET.get("wfo"):
-        ids = request.GET.get("wfo").split(",")
-        shopcarset = shopcarset.filter(id__in=ids)
-    shopcars = list(shopcarset.values())
-    total_amount = 0
-    total_fee = 0
-    for sc in shopcars:
-        sc["total_price"] = sc["amount"] * sc["price"]
-        total_amount += sc["amount"]
-        total_fee += sc["total_price"]
-    return shopcars,total_amount,total_fee
-
-def add_user_address(request):
-    """
-    """
-    user_id = request.session.get("user")["id"]
-    qdata = request.json
-    qdata["cid"] = user_id
-    if request.POST.get("id"):
-        cm.UserAddress.objects.filter(id=request.POST.get("id")).update(**qdata)
-        return True
-    else:
-        obj = cm.UserAddress.objects.create(**qdata)
-        return obj.id
-
-def set_default_address(request):
-    """设置默认收货地址
-    """
-    _id = request.POST.get("id")
-    cm.UserAddress.objects.all().update(isdefault=0)
-    cm.UserAddress.objects.filter(id=_id).update(isdefault=1)
-
-
-def del_user_address(request):
-    """
-    """
-    _id = request.GET.get("id")
-    flag = cm.UserAddress.objects.filter(id=_id).delete()
-    return flag
-
-def get_user_address(request):
-    """获取用户地址
-    """
-    user_id = request.session.get("user")["id"]
-    uaset = cm.UserAddress.objects.filter(cid=user_id).order_by("-id")
-    uadata = list(uaset.values())
-    return uadata
-
-def get_sel_user_address(request):
-    """获取默认用户地址
-    """
-    user_id = request.session.get("user")["id"]
-    if request.GET.get("seladd"):
-        uaset = cm.UserAddress.objects.filter(id=request.GET.get("seladd"))
-    else:
-        uaset = cm.UserAddress.objects.filter(cid=user_id,isdefault=1)
-    if uaset:
-        uadata = list(uaset.values())
-        return uadata
-    else:
-        return []
-
-def get_user_address_info(request):
-    """获取用户地址
-    """
-    id = request.GET.get("id")
-    uaset = cm.UserAddress.objects.filter(id=id)
-    uadata = list(uaset.values())
-    uadata = uadata[0] if uadata else {}
-    return uadata
-
-def group_shopcar_byshopid(car_ids):
-    """
-    """
-    car_list = []
-    cardct = {}
-    for cid in car_ids:
-        shop_id = cm.ShopCar.objects.filter(id=cid).first().shop_id
-        if not cardct.has_key(shop_id):
-            cardct[shop_id] = [cid]
-        else:
-            cardct[shop_id].append(cid)
-    for k,v in cardct.items():
-        car_list.append({"shop_id":k,"cars":v})
-    return car_list
-
-def do_submitorder(request):
-    """
-    """
-    user_id = request.session.get("user")["id"]
-    qdata = request.json
-    addr_id = qdata.get("addrid")
-    remark = qdata.get("memo")
-    car_ids = qdata.get("wfo")
-    if not addr_id or not car_ids:
-        raise ce.TipException(u"参数错误!")
-    car_ids = car_ids.split(",")
-    cars = group_shopcar_byshopid(car_ids)
-    #下总订单
-    m_totalfee = 0
-    for ci in car_ids:
-        shopcar = cm.ShopCar.objects.get(id=ci)
-        m_totalfee += shopcar.amount * shopcar.price
-    morderno = "mo"+str(int(time.time()*1000))
-    mobj = cm.MergOrders.objects.create(
-        orderno = morderno, 
-        totalfee = m_totalfee, 
-        remark = remark
-    )
-
-    #按商家下订单
-    for car in cars:
-        shop_id = car["shop_id"]
-        shop_name = cm.Shop.objects.get(id=shop_id).name
-        goods_name = car.goods_name
-        carids = car["cars"]
-        carids_str = ",".join([str(x) for x in car["cars"]])
-        totalfee = 0
-        #
-        shopcar = cm.ShopCar.objects.get(id=cid)
-        totalfee += car.amount * car.price
-        orderno = str(int(time.time()*1000))
-        #生成订单
-        obj = cm.Orders.objects.create(
-            merg_orderno = mobj.orderno,
-            shop_id = shop_id, 
-            shop_name = shop_name, 
-            goods_name = goods_name, 
-            orderno = orderno,
-            totalfee = totalfee,
-            car_ids = carids_str,
-            user_id = user_id,
-            remark = remark
-        )
-        #更新购物车
-        car.order_id = obj.id
-        car.save()
-    return mobj.orderno
-
-
-def do_m_submitorder(request):
-    """
-    """
-    user_id = request.session.get("user")["id"]
-    qdata = request.GET
-    addr_id = qdata.get("addrid")
-    remark = qdata.get("memo")
-    car_ids = qdata.get("wfo")
-    paytype = qdata.get("paytype")
-    if not addr_id or not car_ids:
-        raise ce.TipException(u"参数错误!")
-    car_ids = car_ids.split(",")
-    cars = group_shopcar_byshopid(car_ids)
-    #下总订单
-    m_totalfee = 0
-    for ci in car_ids:
-        shopcar = cm.ShopCar.objects.get(id=ci)
-        m_totalfee += shopcar.amount * shopcar.price
-    morderno = "mo"+str(int(time.time()*1000))
-    mobj = cm.MergOrders.objects.create(
-        orderno = morderno, 
-        totalfee = m_totalfee, 
-        remark = remark
-    )
-
-    #按商家下订单
-    for car in cars:
-        shop_id = car["shop_id"]
-        shop_name = cm.Shop.objects.get(id=shop_id).name
-        carids = car["cars"]
-        carids_str = ",".join([str(x) for x in car["cars"]])
-        for cid in carids:
-            shopcar = cm.ShopCar.objects.get(id=cid)
-            goods_id = shopcar.goods_id
-            goods_name = shopcar.goods_name
-            price = shopcar.price
-            amount = shopcar.amount
-            totalfee = shopcar.amount * shopcar.price
-            orderno = str(int(time.time()*1000))
-            obj = cm.Orders.objects.create(
-                merg_orderno = mobj.orderno,
-                shop_id = shop_id, 
-                shop_name = shop_name, 
-                goods_name = goods_name, 
-                goods_id = goods_id, 
-                amount = amount,
-                price = price, 
-                paytype = paytype, 
-                addr_id = addr_id, 
-                orderno = orderno,
-                totalfee = totalfee,
-                car_ids = carids_str,
-                user_id = user_id,
-                remark = remark
-            )
-        for cid in carids:
-            shopcar = cm.ShopCar.objects.filter(id=cid).update(order_id=obj.id)
-    return mobj.orderno,mobj.totalfee,shop_name
-
-
-def get_order_info(orderno):
-    """
-    """
-    if orderno:
-        if "mo" in orderno:
-            orderinfo = cm.MergOrders.objects.filter(orderno=orderno).values().first()
-        else:
-            orderinfo = cm.Orders.objects.filter(orderno=orderno).values().first()
-        return orderinfo
-    return {}
-
-def get_orders_list(request):
-    """
-    """
-    orders = cm.Orders.objects.all()
-    orders = list(orders.values())
-    for o in orders:
-        o["shop_img"] = cm.Shop.objects.filter(id=o["shop_id"]).first().logo
-        o["goods_img"] = cm.Goods.objects.filter(id=o["goods_id"]).first().img
-        o["user_name"] = cm.UserInfo.objects.filter(id=o["user_id"]).first().name
-    return orders
-
-
-def get_wxpay_qrcode(orderno):
-    """
-    """
-    orderinfo = get_order_info(orderno)
-    wxpayurl = getQrcodeUrl(orderinfo["orderno"],"test",orderinfo["totalfee"])
-    buf_str = gen_general_qrcode(wxpayurl)
-    return buf_str
-
-
-def do_wxpay_notify(request):
-    qdata = request.json
-    res = wxpay.Common_util_pub.XMLToArray(request.body)
-    if res.get("return_code")=="SUCCESS":
-        out_trade_no = res.get("out_trade_no")
-        transaction_id = res.get("transaction_id")
-        pay_time = res.get("time_end")
-        return_code = res.get("return_code")
-        if return_code == "SUCCESS" and cm.MergOrders.objects.filter(orderno=out_trade_no[:-2]).first().status==0:
-        #if return_code == "SUCCESS":
-            cm.MergOrders.objects.filter(orderno=out_trade_no[:-2]).update(status=1)
-            cm.Orders.objects.filter(merg_orderno=out_trade_no[:-2]).update(status=1,pay_time=datetime.datetime.now())
-            #向平台发送通知消息
-            order = cm.Orders.objects.filter(merg_orderno=out_trade_no[:-2]).first()
-            user = cm.UserInfo.objects.filter(id=order.user_id).first()
-            name = user.name
-            orderno = order.orderno
-            goods = cm.Goods.objects.filter(id=order.goods_id).first().name
-            amount = order.amount
-            totalfee = order.totalfee
-            send_pay_notice("17760590282",name,orderno,goods,amount,totalfee)
-            send_pay_notice("18181383070",name,orderno,goods,amount,totalfee)
-            return True
-    return False
-
-
-
-

+ 0 - 20
src/zkyuan/hashcompat.py

@@ -1,20 +0,0 @@
-"""
-The md5 and sha modules are deprecated since Python 2.5, replaced by the
-hashlib module containing both hash algorithms. Here, we provide a common
-interface to the md5 and sha constructors, preferring the hashlib module when
-available.
-"""
-
-try:
-    import hashlib
-    md5_constructor = hashlib.md5
-    md5_hmac = md5_constructor
-    sha_constructor = hashlib.sha1
-    sha_hmac = sha_constructor
-except ImportError:
-    import md5
-    md5_constructor = md5.new
-    md5_hmac = md5
-    import sha
-    sha_constructor = sha.new
-    sha_hmac = sha

+ 0 - 126
src/zkyuan/lock_account.py

@@ -1,126 +0,0 @@
-# coding:utf-8
-from django.core.cache import cache
-
-import common.error_info as cei
-
-MAX_ERROR_TIMES = 5
-MAX_ERROR_TIMES_IP = 20
-LOCK_IP_TMP = 'LOCK_IP_{}'
-LOCK_ACCOUNT_TMP = 'LOCK_ACCOUNT_{}'
-
-ACCOUNT_INCR_TMP = 'ACCOUNT_COUNT_{}'
-IP_INCR_TMP = 'IP_COUNT_{}'
-
-
-def is_lock(uid, ip):
-    """
-    是否锁
-    :param uid:
-    :param ip:
-    :return:
-    """
-    account_key = LOCK_ACCOUNT_TMP.format(uid)
-    ip_key = LOCK_IP_TMP.format(ip)
-
-    if cache.get(ip_key):
-        return "ip_lock"
-    if cache.get(account_key):
-        return "account_lock"
-    return False
-
-def is_lock_ip(ip):
-    """是否封禁IP
-    """
-    ip_key = LOCK_IP_TMP.format(ip)
-    if cache.get(ip_key):
-        return True
-    return False
-
-
-def increase_error_count(uid, ip):
-    """
-    5分钟内连续输错五次
-    :return:
-    """
-    ip_key = IP_INCR_TMP.format(ip)
-    ip_count = cache.get(ip_key) or 0
-
-    account_key = ACCOUNT_INCR_TMP.format(uid)
-    account_count = cache.get(account_key) or 0
-
-    if account_count + 1 >= MAX_ERROR_TIMES or ip_count + 1 >= MAX_ERROR_TIMES:
-        lock(uid, ip)
-        raise cei.TipException(u'密码连续输错五次,锁定ip和账户半个小时')
-    if not account_count:
-        cache.set(account_key, 1, 5*60)
-    else:
-        cache.incr(account_key)
-    if not ip_count:
-        cache.set(ip_count, 1, 5*60)
-    else:
-        cache.incr(ip_key)
-
-def increase_error_count_ip(ip):
-    """
-    """
-    ip_key = IP_INCR_TMP.format(ip)
-    ip_count = cache.get(ip_key) or 0
-    if ip_count + 1 >= MAX_ERROR_TIMES_IP:
-        lock(0,ip)
-        raise cei.TipException(u'密码连续输错20次,锁定ip半个小时!')
-    if not ip_count:
-        cache.set(ip_key, 1, 30*60)
-    else:
-        cache.incr(ip_key)
-
-def increase_error_count_uid(uid):
-    """
-    """
-    account_key = ACCOUNT_INCR_TMP.format(uid)
-    account_count = cache.get(account_key) or 0
-    if account_count + 1 >= MAX_ERROR_TIMES:
-        lock(uid,0)
-        raise cei.TipException(u'密码连续输错5次,锁定账户10分钟!')
-    if not account_count:
-        cache.set(account_key, 1, 10*60)
-    else:
-        cache.incr(account_key)
-
-
-
-def clear_lock_count(uid, ip):
-    """
-    清除计数,清楚锁ip,锁account的key
-    :param uid:
-    :param ip:
-    :return:
-    """
-    if uid:
-        cache.delete(ACCOUNT_INCR_TMP.format(uid))
-    if ip:
-        cache.delete(IP_INCR_TMP.format(ip))
-
-
-def lock(uid, ip):
-    """
-    锁账户,ip半个小时
-    :param uid:
-    :param ip:
-    :return:
-    """
-    clear_lock_count(uid, ip)
-    if uid:
-        key = LOCK_ACCOUNT_TMP.format(uid)
-        cache.set(key, 'lock_account', 10*60)
-    if ip:
-        key = LOCK_IP_TMP.format(ip)
-        cache.set(key, 'lock_ip', 30*60)
-
-def clear_lock(uid,ip):
-    clear_lock_count(uid, ip)
-    if uid:
-        key = LOCK_ACCOUNT_TMP.format(uid)
-        cache.delete(key)
-    if ip:
-        key = LOCK_IP_TMP.format(ip)
-        cache.delete(IP_INCR_TMP.format(ip))

+ 0 - 6
src/zkyuan/models.py

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

+ 0 - 37
src/zkyuan/password_handle.py

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

+ 0 - 0
src/zkyuan/templatetags/__init__.py


+ 0 - 17
src/zkyuan/templatetags/tplfilters.py

@@ -1,17 +0,0 @@
-#-*-coding:utf-8 -*-
-from django import template
-
-register = template.Library()
-
-def ismp4(value):
-    """
-    """
-    return value.split(".")[-1] == ".mp4"
-
-def split(value,args):
-    """
-    """
-    return value.split(args)
-
-register.filter('ismp4', ismp4)
-register.filter('split', split)

+ 0 - 11
src/zkyuan/urls_backstage.py

@@ -1,11 +0,0 @@
-# coding=utf-8
-'''
-'''
-from django.conf.urls import url
-from zkyuan import views,views_backstage
-
-urlpatterns = [
-    url(r'^api/survey/message/(?P<msgid>\d+)$', views.MessageSurveyView.as_view()),
-    url(r'^dwz/(?P<dwzid>\w+)$', views.DwzView.as_view()),
-]
-

+ 0 - 829
src/zkyuan/views.py

@@ -1,829 +0,0 @@
-# coding=utf-8
-from __future__ import unicode_literals
-import time
-import random
-import json
-import uuid,re
-from django.contrib import auth
-from django.core.cache import cache
-from django.conf import settings
-
-import common.error_info as ce
-from common import core_views as cv
-from common.captcha import create_imgcode
-from common.models import UserInfo
-import common.models as cm
-import controls as ctl
-import common.common_control as ccc
-import common.common_functions as ccf
-from utils.cloopen_sms import cloopensms
-from utils.aestool import aescbc
-from .wxqrcodepay import *
-from .wzhifuSDK import *
-import sys
-reload(sys)
-sys.setdefaultencoding( "utf-8" )
-
-class DwzView(cv.BaseView):
-    def get(self, request,dwzid=None):
-        """#问卷调查数据
-        """
-        try:
-            if dwzid:
-                id_type = aescbc.decrypt(dwzid)
-                url = settings.HOST + "/survey/answer.html?id={}&type={}".format(id_type.split("_")[0],id_type.split("_")[1])
-                return cv.to_redirect(url)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class MessageSurveyView(cv.BaseView):
-    def get(self, request,msgid=None):
-        """#问卷调查数据
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"messageSurvey.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class CaptchaView(cv.BaseView):
-    def get(self, request):
-        """#获取图形验证码(管理后台)
-        >imgcode_id:"",后台返回登录时和验证码一起回传给后台
-        >imgcode:"",验证码图片base64
-        """
-        captcha, buf_str = create_imgcode(4)
-        uid = str(uuid.uuid4())
-        cache.set(uid, captcha, 30 * 60)
-        request.session["regimgcode"] = captcha
-        return cv.to_response(buf_str)
-
-class RegistView(cv.BaseView):
-    def get(self, request):
-        """#注册
-        """
-        try:
-            rst = {}
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            rst["user"] = request.session.get("user")
-            return cv.to_render(request,"register.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-    def post(self, request):
-        """#注册
-        """
-        try:
-            rst = {}
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            user = ctl.regist_user(request)
-            request.session["user"] = {"id":user.id,"name":user.name,"realname":user.realname}
-            return cv.to_suc()
-        except Exception as e: 
-            import traceback
-            traceback.print_exc()
-            return cv.to_fail(e)
-
-class LoginView(cv.BaseView):
-    def get(self, request):
-        """#登录
-        """
-        try:
-            rst = {}
-            full_path = request.get_full_path()
-            reffer = re.search("rf=(.*)",full_path)
-            if reffer:
-                rst["reffer"] = reffer.groups()[0]
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"sign.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class LoginDoView(cv.BaseView):
-    def post(self, request):
-        """#账号登录(APP,0/1/2/3(管理员/政府/企业/员工))
-        @username:"root",str,账号
-        @password:"root",str,密码
-        @registration_id:"极光推送客户端集成后生成的id和设备唯一对应"
-        """
-        try:
-            rst = ctl.login_user(request)
-            return cv.to_suc(rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserMainView(cv.BaseView):
-    def get(self, request):
-        """#会员中心
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"usermain.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserInfoView(cv.AuthView):
-    def get(self, request):
-        """#用户信息
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            rst["user"]["avatar"] = "/mstatic/imgs/avatar.png"
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userinfo.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserPwdView(cv.BaseView):
-    def get(self, request):
-        """#用户信息
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userpwd.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserCollView(cv.BaseView):
-    def get(self, request):
-        """#我的收藏
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"usercoll.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserOrderView(cv.BaseView):
-    def get(self, request):
-        """#我的订单
-        """
-        try:
-            rst = {}
-            rst["orders"] = ctl.get_orders_list(request)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userorder.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserAddressView(cv.AuthView):
-    def get(self, request):
-        """#新增地址
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("act") == "del":
-                ctl.del_user_address(request)
-            reffer = request.META.get("HTTP_REFERER")
-            rst["reffer"] = reffer
-            if reffer and "submitorder" in reffer:
-                rst["fromorder"] = 1
-            rst["address"] = ctl.get_user_address(request)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"useraddress.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserAddressDefaultView(cv.AuthView):
-    def post(self, request):
-        """#设置默认地址
-        """
-        try:
-            rst = {}
-            ctl.set_default_address(request)
-            return cv.to_suc(rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserAddressAddView(cv.BaseView):
-    def get(self, request):
-        """用户地址
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            rst["reffer"] = request.META.get("HTTP_REFERER")
-            if request.GET.get("id"):
-                rst["address"] = ctl.get_user_address_info(request)
-            rst["citys"] = json.dumps(ctl.get_citys_data())
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"useraddressadd.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-    def post(self, request):
-        """用户地址
-        """
-        try:
-            rst = {}
-            uadid = ctl.add_user_address(request)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_redirect("/user/address")
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserMyShopView(cv.BaseView):
-    def get(self, request):
-        """#我的店铺
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"usershop.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserApplyShopView(cv.BaseView):
-    def get(self, request):
-        """#申请店铺
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userapplyshop.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserShopStateView(cv.BaseView):
-    def get(self, request):
-        """#店铺状态
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"usershopstate.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserApplyCashView(cv.BaseView):
-    def get(self, request):
-        """#申请结算
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userapplycash.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserBankCardView(cv.BaseView):
-    def get(self, request):
-        """#申请结算
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userbankcard.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserInviteView(cv.BaseView):
-    def get(self, request):
-        """#申请结算
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userinvite.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserMyInviteView(cv.BaseView):
-    def get(self, request):
-        """#申请结算
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"usermyinvite.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class UserInviteIncomeView(cv.BaseView):
-    def get(self, request):
-        """#申请结算
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"userinviteincome.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class UserShopCarView(cv.AuthView):
-    def get(self, request):
-        """#购物车
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("act") in ["new","del","anum","dnum"]:
-                ctl.manage_shopcar(request)
-                return cv.to_redirect("/user/shopcar")
-            shopcars,total_amount,total_fee = ctl.get_user_shopcars(request)
-            rst["total_amount"] = total_amount
-            rst["total_fee"] = total_fee
-            rst["shopcars"] = shopcars
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"usershopcar.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class IndexView(cv.BaseView):
-    def get(self, request):
-        """#首页数据
-        """
-        try:
-            rst = ctl.get_index_data()
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"index.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class ListView(cv.BaseView):
-    def get(self, request,cat=None):
-        """#列表数据
-        """
-        try:
-            rst = {}
-            rst = ctl.get_list_data(request,cat)
-            rst["user"] = request.session.get("user")
-            #return cv.to_suc(rst)
-            rst["goods"] = [x for x in range(0,20)]
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"list.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class CityListView(cv.BaseView):
-    def get(self, request,city=None):
-        """#列表数据
-        """
-        try:
-            rst = {}
-            rst = ctl.get_list_data(request,None,city)
-            rst["user"] = request.session.get("user")
-            #return cv.to_suc(rst)
-            rst["goods"] = [x for x in range(0,20)]
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"list.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class CatListView(cv.BaseView):
-    def get(self, request,cat=None,city=None):
-        """#列表数据
-        """
-        try:
-            rst = {}
-            cats = ctl.get_index_cats()
-            rst["cats"] = cats
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"cat.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class ListView(cv.BaseView):
-    def get(self, request,cat=None,city=None):
-        """#列表数据
-        """
-        try:
-            rst = {}
-            rst = ctl.get_list_data(request,cat,city)
-            rst["user"] = request.session.get("user")
-            #return cv.to_suc(rst)
-            rst["goods"] = [x for x in range(0,20)]
-            rst["goods"] = ctl.get_goods_list()
-            rst["recgoods"] = ctl.get_goods_list()
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"list.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class DetailView(cv.BaseView):
-    def get(self, request,id=None):
-        """#详情数据
-        """
-        try:
-            rst = {}
-            rst = ctl.get_goods_info(id)
-            rst["user"] = request.session.get("user")
-            shopid = rst["shopinfo"]["id"]
-            rst["navs"] = ctl.get_shop_navs(shopid)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"detail.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class NewsListView(cv.BaseView):
-    def get(self, request,cat=None):
-        """#新闻列表数据
-        """
-        try:
-            rst = {}
-            rst = ctl.get_news_list(cat)
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"newslist.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class ShopNewsListView(cv.BaseView):
-    def get(self, request,shopid=None,cat=None):
-        """#新闻列表数据
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            rst["navs"] = ctl.get_shop_navs(shopid)
-            shopinfo = ctl.get_shop_info(shopid)
-            rst["shopinfo"] = shopinfo
-            #新闻页推荐商品
-            rst["rec_goods"] = ctl.get_shop_goods(shopid)
-            #新闻列表数据
-            rst["newscategory_id"] = cat
-            rst["newscategory"] = cm.NewsCategory.objects.get(id=cat).name
-            rst["news"] = ctl.get_shop_news(shopid,cat)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"shopnewslist.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class NewsDetailView(cv.BaseView):
-    def get(self, request,id=None):
-        """#新闻详情页
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            rst = ctl.get_news_info(id)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"newsdetail.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class ShopNewsDetailView(cv.BaseView):
-    def get(self, request,shopid,id=None):
-        """#新闻详情页
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            rst["navs"] = ctl.get_shop_navs(shopid)
-            shopinfo = ctl.get_shop_info(shopid)
-            rst["shopinfo"] = shopinfo
-            #新闻页推荐商品
-            rst["rec_goods"] = ctl.get_shop_goods(shopid)
-            #新闻详情
-            rst["news"] = ctl.get_news_info(id)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"shopnewsdetail.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-
-class ShopView(cv.BaseView):
-    def get(self, request,shopid=None):
-        """#店铺页
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            #店铺导航
-            rst["navs"] = ctl.get_shop_navs(shopid)
-            shopinfo = ctl.get_shop_info(shopid)
-            rst["shopinfo"] = shopinfo
-            banners = ctl.get_shop_banners(shopid)
-            rst["banners"] = banners
-            #商家推荐产品
-            rec_goods = ctl.get_shop_recgoods(shopid)
-            rst["rec_goods"] = rec_goods
-            #产品服务
-            goods = ctl.get_shop_goods(shopid)
-            rst["goods"] = goods
-            #新闻中心
-            rst["news"] = ctl.get_shop_news(shopid,u"新闻中心")[:5]
-            #关于我们
-            aboutus = ctl.get_shop_news(shopid,u"关于我们")
-            rst["aboutus"] = aboutus[0] if aboutus else {}
-            #图片相册
-            rst["imgs_news"] = ctl.get_shop_news(shopid,u"图片相册")
-
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"shop.html",rst)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-
-class SubmitOrderView(cv.AuthView):
-    def get(self, request,shopid=None):
-        """#提交订单
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            shopcars,total_amount,total_fee = ctl.get_user_shopcars(request)
-            rst["total_amount"] = total_amount
-            rst["total_fee"] = total_fee
-            rst["shopcars"] = shopcars
-            rst["useraddress"] = ctl.get_sel_user_address(request)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"submitorder.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class DoSubmitOrderView(cv.AuthView):
-    def post(self, request,shopid=None):
-        """#执行提交订单
-        """
-        try:
-            rst = {}
-            orderno = ctl.do_submitorder(request)
-            rst["orderno"] = orderno
-            return cv.to_suc(rst)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class ToPayView(cv.BaseView):
-    def get(self, request):
-        """#去支付
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            orderno = request.GET.get("orderno")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            rst["orderinfo"] = ctl.get_order_info(orderno)
-            return cv.to_render(request,"topay.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class PaymentView(cv.BaseView):
-    def get(self, request):
-        """#去支付
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            orderno = request.GET.get("orderno")
-            rst["orderinfo"] = ctl.get_order_info(orderno)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"payment.html",rst)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class PaymentWxView(cv.BaseView):
-    def get(self, request):
-        """#微信支付
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            orderno = request.GET.get("orderno")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            buf_str = ctl.get_wxpay_qrcode(orderno)
-            return cv.to_response(buf_str)
-            #return cv.to_render(request,"payment.html",rst)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-
-class MPaymentWxView(cv.BaseView):
-    def get(self, request):
-        """#微信支付
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            print request,44444444
-            if not request.GET.get("code") and ccf.isWechat(request.META["HTTP_USER_AGENT"]):
-                print request.GET,77777777777777
-                orderno,total_fee,shop_name = ctl.do_m_submitorder(request)
-                wx_get_code_url = 'https://open.weixin.qq.com/connect/oauth2/authorize?appid='+WxPayConf_pub.APPID+'&redirect_uri=http://www.zhenlaoxiang.com/payment/mwxpay/?tot_ser=%s_%s&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect'%(orderno,total_fee)
-                print wx_get_code_url,555555555555555
-                return cv.to_redirect(wx_get_code_url)
-            else:
-                if ccf.isWechat(request.META["HTTP_USER_AGENT"]):
-                    code = request.GET.get("code")
-                    print code,7777777777777777
-                    openid = get_openid(code)
-                    tot_ser = request.GET.get("tot_ser")
-                    print tot_ser,8888888888888888888
-                    orderno = tot_ser.split("_")[0]
-                    total_fee = float(tot_ser.split("_")[1])
-                    #orderno,total_fee,shop_name = ctl.do_m_submitorder(request)
-                    ip = cv.get_ip(request)
-                    print ip
-                    #openid = "oCF-2v_neXavhH7fqkVnqZADoZTI"
-                    prepay_id,nonce_str,appId,key = getWxJSPAY(orderno,"test",total_fee,openid,ip)
-                    print prepay_id,nonce_str,appId,key
-                    return cv.to_render(request,"wxjspay.html",{"prepay_id":prepay_id,"nonce_str":nonce_str,"appId":appId,"key":key})
-                else:
-                    code = request.GET.get("code")
-                    #openid = get_openid(code)
-                    openid = None
-                    tot_ser = request.GET.get("tot_ser")
-                    #orderno = tot_ser.split("_")[0]
-                    #total_fee = float(tot_ser.split("_")[1])
-                    orderno,total_fee,shop_name = ctl.do_m_submitorder(request)
-                    ip = cv.get_ip(request)
-                    #prepay_id,nonce_str,timestamp = getWxJSPAY(orderno,total_fee,openid,ip)
-                    print ip,9999999999999
-                    mweb_url = getWxH5PAY(orderno,"test",total_fee,openid,ip)
-                    #return cv.to_suc(11111111)
-                    print mweb_url,88888888888888888888
-                    return cv.to_redirect(mweb_url)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class PaymentNotifyView(cv.BaseView):
-    def post(self, request):
-        """#微信支付
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            ctl.do_wxpay_notify(request)
-            return cv.to_suc(rst)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class PaymentStatusView(cv.BaseView):
-    def get(self, request):
-        """#支付状态
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            orderno = request.GET.get("orderno")
-            orderinfo = ctl.get_order_info(orderno)
-            if orderinfo["status"] == 1:
-                return cv.to_suc(rst)
-            else:
-                return cv.to_fail(u"undone")
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class PaymentSuccessView(cv.BaseView):
-    def get(self, request):
-        """#去支付
-        """
-        try:
-            rst = {}
-            rst["user"] = request.session.get("user")
-            orderno = request.GET.get("orderno")
-            rst["orderinfo"] = ctl.get_order_info(orderno)
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            return cv.to_render(request,"success.html",rst)
-        except Exception as e: 
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class LogoutView(cv.AuthView):
-    def get(self, request):
-        '''
-        #退出登录(管理后台)
-        '''
-        del request.session["user"]
-        return cv.to_redirect("/")
-
-
-class GetDefaultView(cv.AuthView):
-    def get(self, request):
-        """
-        #获取默认数据风险点和任务状态(APP)
-        """
-        try:
-            rst = ctl.get_default_data(request)
-            return cv.to_suc(rst)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-
-class MobileView(cv.BaseView):
-    def get(self, request):
-        """#注册
-        """
-        try:
-            rst = {}
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            rst["user"] = request.session.get("user")
-            return cv.to_render(request,"mobile/index.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class AdminView(cv.BaseView):
-    def get(self, request):
-        """#注册
-        """
-        try:
-            rst = {}
-            if request.GET.get("json"):
-                return cv.to_suc(rst)
-            rst["user"] = request.session.get("user")
-            return cv.to_render(request,"admin/index.html",rst)
-        except Exception as e: 
-            return cv.to_fail(e)
-
-class TestView(cv.BaseView):
-    def get(self, request):
-        """#注册
-        """
-        try:
-            with open("/tmp/test1.docx","rw") as f:
-                #f = open("/tmp/test.xls","rw")
-                data = f.read()
-                f.seek(0)
-                f.close()
-            import base64
-            data = base64.b64encode(data) 
-            #data = json.dumps(data)
-            #print json.dumps(data)
-            return cv.to_suc(data)
-            #return cv.to_response(data)
-        except Exception as e:
-            import traceback
-            traceback.print_exc()
-            #print data
-            return cv.to_fail(e)

+ 0 - 299
src/zkyuan/views_backstage.py

@@ -1,299 +0,0 @@
-#-*-coding:utf-8-*-
-import json
-import uuid
-from django.contrib import auth
-from django.core.cache import cache
-from django.conf import settings
-
-from common import core_views as cv
-from common.models import UserInfo
-import common.common_functions as ccf
-import common.error_info as ce
-import control_user as cu
-import control_role as crol
-import control_organization as co
-import common.common_control as ccc
-import control_permission as cp
-import control_department as cd
-import control_bankcard as cb
-
-
-class InfoView(cv.AdminView):
-    def get(self, request):
-        '''
-        #获取全局账号信息(权限控制)
-        '''
-        try:
-            users = cu.get_account_info(request)
-            return cv.to_suc(users)
-        except Exception as e:
-            return cv.to_fail(e)
-
-class UserInfoView(cv.BaseView):
-    def get(self, request):
-        """
-        #获取用户个人信息
-        @id:1,用户id
-        """
-        try:
-            data = cu.get_user_personal_info(request)
-            return cv.to_suc(data)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-class UserView(cv.BaseView):
-    def get(self, request):
-        """
-        #获取用户详情
-        @id:1,用户id
-        """
-        try:
-            data = cu.get_user_info(request)
-            return cv.to_suc(data)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-    def post(self, request):
-        '''
-        #新增员工
-        @realname:"肖小肖",员工名称
-        @phone:"129823"
-        @email:"129823@qq.com"
-        @department_id:1,部门id
-        @utype:1/2/3,员工类型
-        @is_active:1/0,是否启用
-        @remark:"好员工",备注
-        '''
-        qdata = request.json
-        try:
-            rst = cu.add_user(request)
-            return cv.to_suc()
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-
-    def put(self, request):
-        """
-        #修改员工
-        @id:1,员工id
-        @realname:"肖小肖",员工名称
-        @phone:"129823"
-        @email:"129823@qq.com"
-        @department_id:1,部门id
-        @utype:1/2/3,员工类型
-        @is_active:1/0,是否启用
-        @remark:"好员工",备注
-        """
-        qdata = request.json
-        try:
-            data = cu.update_user(request)
-        except Exception as e:
-            return cv.to_fail(e)
-        return cv.to_suc(data)
-
-    def delete(self, request):
-        """
-        #删除员工
-        @id:1,多个id用逗号分隔
-        """
-        qdata = request.json
-        try:
-            cu.delete_user(request)
-        except Exception as e:
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-class UserListView(cv.AuthView):
-    def get(self, request):
-        """
-        #员工列表
-        @name:"用户名"
-        @department_id:1
-        @utype:1
-        @is_active:1
-        """
-        try:
-            total,res = cu.get_user_list(request)
-            return cv.to_suc({"total":total,"list":res})
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class UnauditUserListView(cv.AuthView):
-    def get(self, request):
-        """
-        #待审核员工列表
-        @name:"用户名"
-        @utype:1
-        """
-        try:
-            total,res = cu.get_unaudit_user_list(request)
-            return cv.to_suc({"total":total,"list":res})
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class PermissionListView(cv.AuthView):
-    def get(self, request):
-        """#权限列表
-        @role_id:1 角色id 可选参数 传了就只返回对应角色的权限
-        @platform:"operation" 权限归属 可选参数 传了就对权限进行平台过滤
-        """
-        qdata = request.json
-        role_id = qdata.get("role_id",None)
-        platform = qdata.get("platform",None)
-        roles = cp.get_permission_list(role_id,platform)
-
-        return cv.to_suc(roles)
-
-
-class ResetPwdView(cv.BaseView):
-    def put(self, request):
-        """
-        #重置密码(忘记密码)
-        @phone:"15982456282",手机号
-        @password:"",新密码
-        @repassword:"",确认密码
-        @phcode:"123",验证码
-        """
-        try:
-            cu.reset_password(request)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class ResetUserPwdView(cv.AuthView):
-    def put(self, request):
-        """
-        #修改用户密码
-        @uid:10,用户id不传则默认当前用户
-        @code:"",验证码
-        @password:"",新密码
-        """
-        try:
-            cu.reset_user_password(request)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class DepartmentView(cv.AuthView):
-    def post(self,request):
-        """
-        #新增部门
-        @name:"综管部",部门名称
-        @pid:1,上级部门
-        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
-        """
-        try:
-            cd.add_department(request)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-    def put(self,request):
-        """
-        #修改部门
-        @id:1,部门id
-        @name:"综管部",部门名称
-        @pid:1,上级部门
-        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
-        """
-        try:
-            cd.update_department(request)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-    def delete(self,request):
-        """
-        #删除部门
-        @id:1,部门id
-        """
-        try:
-            cd.delete_department(request)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class DepartmentListView(cv.AuthView):
-    def get(self,request):
-        """#部门列表
-        @name:"研发",部门名称
-        """
-        try:
-            total,rst = cd.get_department_list(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc({"total":total,"list":rst})
-
-
-class UserBankCardView(cv.AuthView):
-    def post(self,request):
-        """#新增银行卡
-        @name:"建设银行",银行名称
-        @cardno:"6229000",银行卡卡号
-        """
-        try:
-            rst = cb.add_bankcard(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-    def delete(self,request):
-        """#删除银行卡
-        @id:1,银行卡id
-        """
-        try:
-            rst = cb.delete_bankcard(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-
-class UserBankCardListView(cv.AuthView):
-    def get(self,request):
-        """#银行卡列表
-        """
-        try:
-            rst = cb.get_bankcard_list(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc(rst)
-
-
-class UserIncomeView(cv.AuthView):
-    def get(self,request):
-        """#我的收益
-        """
-        try:
-            rst = cb.get_user_income(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc(rst)
-
-
-class UserApplyCashView(cv.AuthView):
-    def post(self,request):
-        """#申请提现
-        @bankcard_id:1,银行卡id
-        @cashtype:"bank/alipay",提现方式
-        @cashamount:1000,提现金额
-        """
-        try:
-            rst = cb.apply_cash(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc(rst)

+ 0 - 4
src/zkyuan/views_permission.py

@@ -1,4 +0,0 @@
-#-*-coding:utf-8 -*-
-import common.core_views as cv
-
-

+ 0 - 125
src/zkyuan/wxjspay.py

@@ -1,125 +0,0 @@
-#-*-coding:utf-8 -*-
-import requests
-import time
-from wzhifuSDK import *
-import logging
-import random
-import json
-from django.utils.encoding import smart_str
-from hashcompat import md5_constructor as md5
-
-def getSign(params):
-    ks = params.keys()
-    newparams = {}
-    prestr = ''
-    #字典序升序排列
-    ks.sort()
-    for k in ks:
-        v = params[k]
-        k = smart_str(k, 'utf-8')
-        if k not in ('sign','sign_type') and v != '':
-            newparams[k] = smart_str(v, 'utf-8')
-            prestr += '%s=%s&' % (k, newparams[k])
-    prestr = prestr[:-1]
-    print prestr,4444444444444444
-    #sign = md5(prestr+'&key=22c0bbf67e5939b8933ca9a3ce8b3bb9').hexdigest()
-    #sign = md5(prestr+'&key=kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq').hexdigest()
-    sign = md5(prestr+'&key=kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq').hexdigest()
-    return sign.upper()
-
-def get_wxjspay_order(serial_id,totalpay,openid,order_ip="127.0.0.1"):
-    '''
-    '''
-
-    corpid = WxPayConf_pub.APPID 
-    mch_id = WxPayConf_pub.MCHID
-    #nonce_str = Common_util_pub().createNoncestr()
-    notify_url = 'http://www.zhenlaoxiang.com/payment/notify'#%s/' % out_trade_no
-    #预下单获取prepay_id
-    order_obj = UnifiedOrder_pub()
-    order_obj.setParameter('appid',corpid)
-    tmp = random.randint(10,99)
-    nonce_str = "gfdsahjklm"
-    order_obj.setParameter('out_trade_no',str(serial_id)+str(tmp))
-    order_obj.setParameter('body',"test")
-    #order_obj.setParameter('total_fee',str(int(float(totalpay)*100)))
-    order_obj.setParameter('total_fee',int(float(totalpay)*100))
-    order_obj.setParameter('notify_url',notify_url)
-    order_obj.setParameter('trade_type',"JSAPI")
-    order_obj.setParameter('openid',openid)
-    order_obj.setParameter('mch_id', mch_id)
-    order_obj.setParameter('spbill_create_ip',order_ip)
-    order_obj.setParameter('nonce_str',nonce_str)
-    print(order_obj.parameters,9999999999999)
-    #h5
-    #order_obj.setParameter('scene_info',json.dumps({"h5_info":{"type":"Wap","wap_url":"http://www.zhenlaoxiang.com","wap_name":u"真老乡"}}))
-
-    #sign = Common_util_pub().getSign(order_obj.parameters)
-    sign = getSign(order_obj.parameters)
-    print('>>>>>>>>>>>>>>>>>>>>>')
-    order_obj.setParameter('sign',sign)
-    prepay_id = order_obj.getPrepayId()
-    #prepay_id = order_obj.geth5url()
-    return prepay_id,nonce_str,str(int(time.time()))
-
-def get_wxh5pay_order(serial_id,totalpay,order_ip="127.0.0.1"):
-    '''
-    '''
-
-    corpid = WxPayConf_pub.APPID 
-    mch_id = WxPayConf_pub.MCHID
-    nonce_str = Common_util_pub().createNoncestr()
-    trade_type = 'JSAPI'
-
-    notify_url = 'http://www.zhenlaoxiang.com/payment/notify'#%s/' % out_trade_no
-    #预下单获取prepay_id
-    order_obj = UnifiedOrder_pub()
-    order_obj.setParameter('appid',corpid)
-    tmp = random.randint(10,99)
-    nonce_str = "gfdsahjklm"
-    order_obj.setParameter('out_trade_no',str(serial_id)+str(tmp))
-    #order_obj.setParameter('body',property)
-    order_obj.setParameter('body',"真老乡")
-    order_obj.setParameter('total_fee',str(int(float(totalpay)*100)))
-    order_obj.setParameter('notify_url',notify_url)
-    order_obj.setParameter('trade_type','MWEB')
-    #order_obj.setParameter('openid',openid)
-    order_obj.setParameter('mch_id', mch_id)
-    order_obj.setParameter('spbill_create_ip',order_ip)
-    order_obj.setParameter('nonce_str',nonce_str)
-    #h5
-    order_obj.setParameter('scene_info',json.dumps({"h5_info":{"type":"Wap","wap_url":"http://www.zhenlaoxiang.com","wap_name":u"真老乡"}}))
-
-    sign = Common_util_pub().getSign(order_obj.parameters)
-    print('>>>>>>>>>>>>>>>>>>>>>')
-    order_obj.setParameter('sign',sign)
-    prepay_id = order_obj.getPrepayId()
-    #prepay_id = order_obj.geth5url()
-    return prepay_id,nonce_str,str(int(time.time()))
-
-def get_openid(code):
-    """
-    """
-    res = {}
-
-    APPID = WxPayConf_pub.APPID                                               
-    SECRET = WxPayConf_pub.APPSECRET                                  
-
-    get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code' %(APPID,SECRET,code)
-    res = requests.get(get_token_url).json()
-    print(res,9999)
-    if res.has_key('openid'):                                                      
-        open_id = res['openid']                                                    
-    else:                                                                          
-        open_id = '' 
-    return open_id
-
-if __name__ == "__main__":
-    serial_id = "123456"
-    totalpay = 0.01
-    order_ip = "127.0.0.1"
-    open_id = "oCF-2v_neXavhH7fqkVnqZADoZTI"
-    print open_id,999
-    prepay_id = get_wxjspay_order(serial_id,totalpay,open_id,order_ip)
-    #prepay_id = get_wxh5pay_order(serial_id,totalpay,order_ip)
-    print prepay_id

+ 0 - 314
src/zkyuan/wxqrcodepay.py

@@ -1,314 +0,0 @@
-#-*-coding=utf-8 -*-
-import requests
-import random
-import traceback
-import pycurl
-import StringIO
-import logging
-from hashcompat import md5_constructor as md5
-import xml.etree.ElementTree as ET
-from django.utils.encoding import smart_str
-import datetime
-import re
-import time
-import json
-
-def get_openid(code):
-    """
-    """
-    res = {}
-
-    APPID = "wx75c7195d630e2c03"                                               
-    SECRET = "614ab3740bdfb4a296cdda71ba8a069d"                                 
-
-    get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code' %(APPID,SECRET,code)
-    res = requests.get(get_token_url).json()
-    print(res,999999999999999999999999999999999)
-    if res.has_key('openid'):                                                      
-        open_id = res['openid']                                                    
-    else:                                                                          
-        open_id = '' 
-    return open_id
-
-def smart_str(s, encoding='utf-8', strings_only=False, errors='strict'):
-    """
-    Returns a bytestring version of 's', encoded as specified in 'encoding'.
-
-    If strings_only is True, don't convert (some) non-string-like objects.
-    """
-    if strings_only and isinstance(s, (types.NoneType, int)):
-        return s
-    if not isinstance(s, basestring):
-        try:
-            return str(s)
-        except UnicodeEncodeError:
-            if isinstance(s, Exception):
-                # An Exception subclass containing non-ASCII data that doesn't
-                # know how to print itself properly. We shouldn't raise a
-                # further exception.
-                return ' '.join([smart_str(arg, encoding, strings_only,
-                        errors) for arg in s])
-            return unicode(s).encode(encoding, errors)
-    elif isinstance(s, unicode):
-        return s.encode(encoding, errors)
-    elif s and encoding != 'utf-8':
-        return s.decode('utf-8', errors).encode(encoding, errors)
-    else:
-        return s
-
-def getSign(params):
-    ks = params.keys()
-    newparams = {}
-    prestr = ''
-    #字典序升序排列
-    ks.sort()
-    for k in ks:
-        v = params[k]
-        k = smart_str(k, 'utf-8')
-        if k not in ('sign','sign_type') and v != '':
-            newparams[k] = smart_str(v, 'utf-8')
-            prestr += '%s=%s&' % (k, newparams[k])
-    prestr = prestr[:-1]
-    #sign = md5(prestr+'&key=22c0bbf67e5939b8933ca9a3ce8b3bb9').hexdigest()
-    #sign = md5(prestr+'&key=kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq').hexdigest()
-    sign = md5(prestr+'&key=kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq').hexdigest()
-    return sign.upper()
-
-
-def random_str():
-    str = ''
-    chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
-    length = len(chars) - 1
-    rand = random.Random()
-    for i in range(32):
-        str+=chars[rand.randint(0, length)]
-    return str
-
-def array2Xml(parameters):
-    xml = "<xml>"
-    for k,v in parameters.items():
-        if 'total_fee' in k or\
-           'nonce_str' in k or\
-           'mch_id' in k or\
-           'appid' in k or\
-           'transaction_id' in k or\
-           'out_trade_no' in k or\
-           'return_code' in k or\
-           'return_msg' in k:
-            xml = xml + "<"+k+">"+v+"</"+k+">"
-        else:
-            xml = xml + "<"+k+"><![CDATA["+v+"]]></"+k+'>'
-    xml = xml+"</xml>"
-    return xml
-
-def xml2Array(xmlStr):
-    array_data = {}
-    root = ET.fromstring(xmlStr)
-    for child in root:
-        value = child.text
-        array_data[child.tag] = value
-    return array_data
-    
-    
-def postXmlCurl(xmlStr,url):
-    c = pycurl.Curl()
-    c.setopt(pycurl.TIMEOUT, 30)
-    c.setopt(pycurl.URL, url)
-    c.setopt(pycurl.SSL_VERIFYPEER, 0)
-    c.setopt(pycurl.SSL_VERIFYHOST, 0)
-    c.setopt(pycurl.HEADER, 0)
-    #c.setopt(pycurl.RETURNTRANSFER, 0)
-    c.setopt(pycurl.POST, 1)
-    c.setopt(pycurl.POSTFIELDS, xmlStr)
-
-    f = StringIO.StringIO()
-    c.setopt(pycurl.WRITEFUNCTION, f.write)
-    c.perform()
-    data = ''
-    if c.getinfo(c.RESPONSE_CODE) == 200:
-        data = f.getvalue()
-    else:
-        pass
-    c.close()
-    return data
-
-
-#获取商品的微信支付二维码URL
-def getQrcodeUrl(order_number,good_name,totalpay):
-    qrcode_url = ''
-    parameters = dict()
-    #商品描述
-    parameters['body'] = good_name
-    #商品订单号
-    #订单号后随机加2位 以支持订单过期能支付和改价
-    tmp = random.randint(10,99)
-    parameters['out_trade_no'] = str(order_number)+str(tmp)
-    #parameters['out_trade_no'] = str(order_number)
-    #总价
-    parameters['total_fee'] = str(int(totalpay*100))
-    #支付回调地址
-    parameters['notify_url'] = 'http://www.zhenlaoxiang.com/payment/notify'
-    #交易类型 选用NATIVE
-    parameters['trade_type'] = 'NATIVE'
-
-    parameters['appid'] = 'wx75c7195d630e2c03'
-
-    parameters['mch_id'] = '1574308181'
-
-    parameters['nonce_str'] = random_str()
-
-    #生成签名
-    parameters['sign'] = getSign(parameters)
-    #log.debug('weixn_qrcode sign:%s'%parameters['sign'])
-    #print 'sign:',parameters['sign']
-    #把字典转成xml
-    xmlStr = array2Xml(parameters)
-    #print 'pre xmlStr:',xmlStr
-    #log.debug('weixn_qrcode prexmlStr:%s'%xmlStr)
-    #向微信服务器验证
-    veryfiXml = postXmlCurl(xmlStr,"https://api.mch.weixin.qq.com/pay/unifiedorder")
-    #print 'aft xmlStr:',veryfiXml
-    #log.debug('weixn_qrcode aft xmlStr:%s'%veryfiXml)
-    #把xml结果转换成字典 二维码url存放在此
-    qrCodeUrlResultDict = xml2Array(veryfiXml)
-    
-    if "FAIL" == qrCodeUrlResultDict["return_code"]:
-        print 'return_mdg:',qrCodeUrlResultDict["return_msg"]
-        #log.debug('weixn_qrcode return_mdg:%s'%qrCodeUrlResultDict["return_msg"])
-    elif "FAIL" == qrCodeUrlResultDict["result_code"]:
-        print 'err_code:',qrCodeUrlResultDict["err_code"]
-        #log.debug('weixn_qrcode err_code:%s'%qrCodeUrlResultDict["err_code_des"])
-    elif '' != qrCodeUrlResultDict["code_url"]:
-        #log.debug('weixn_qrcode code_url:%s'%qrCodeUrlResultDict["code_url"])
-        qrcode_url = qrCodeUrlResultDict["code_url"]
-        #print qrCodeUrlResultDict["code_url"]
-    else:
-        pass
-    return qrcode_url
-
-
-#获取商品的微信支付二维码URL
-def getWxJSPAY(order_number,good_name,totalpay,openid,ip):
-    appId = 'wx75c7195d630e2c03'
-    key = 'kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq'
-    mch_id = '1574308181'
-    nonce_str = random_str()
-    qrcode_url = ''
-    parameters = dict()
-    #商品描述
-    parameters['body'] = good_name
-    #商品订单号
-    #订单号后随机加2位 以支持订单过期能支付和改价
-    tmp = random.randint(10,99)
-    parameters['out_trade_no'] = str(order_number)+str(tmp)
-    #parameters['out_trade_no'] = str(order_number)
-    #总价
-    parameters['total_fee'] = str(int(totalpay*100))
-    #支付回调地址
-    parameters['notify_url'] = 'http://www.zhenlaoxiang.com/payment/notify'
-    #交易类型 选用NATIVE
-    parameters['trade_type'] = 'JSAPI'
-    parameters['appid'] = appId
-    parameters['mch_id'] = mch_id
-
-    parameters['nonce_str'] = nonce_str 
-    parameters['openid'] = openid
-    parameters['spbill_create_ip'] = ip
-
-    #生成签名
-    parameters['sign'] = getSign(parameters)
-    #log.debug('weixn_qrcode sign:%s'%parameters['sign'])
-    #print 'sign:',parameters['sign']
-    #把字典转成xml
-    xmlStr = array2Xml(parameters)
-    print 'pre xmlStr:',xmlStr
-    #log.debug('weixn_qrcode prexmlStr:%s'%xmlStr)
-    #向微信服务器验证
-    veryfiXml = postXmlCurl(xmlStr,"https://api.mch.weixin.qq.com/pay/unifiedorder")
-    #print 'aft xmlStr:',veryfiXml
-    #log.debug('weixn_qrcode aft xmlStr:%s'%veryfiXml)
-    #把xml结果转换成字典 二维码url存放在此
-    qrCodeUrlResultDict = xml2Array(veryfiXml)
-    
-    if "FAIL" == qrCodeUrlResultDict["return_code"]:
-        print 'return_mdg:',qrCodeUrlResultDict["return_msg"]
-        #log.debug('weixn_qrcode return_mdg:%s'%qrCodeUrlResultDict["return_msg"])
-    elif "FAIL" == qrCodeUrlResultDict["result_code"]:
-        print 'err_code:',qrCodeUrlResultDict["err_code"]
-        #log.debug('weixn_qrcode err_code:%s'%qrCodeUrlResultDict["err_code_des"])
-    elif '' != qrCodeUrlResultDict["prepay_id"]:
-        #log.debug('weixn_qrcode code_url:%s'%qrCodeUrlResultDict["code_url"])
-        qrcode_url = qrCodeUrlResultDict["prepay_id"]
-    else:
-        pass
-    return qrcode_url,nonce_str,appId,key
-
-def getWxH5PAY(order_number,good_name,totalpay,openid,ip):
-    qrcode_url = ''
-    parameters = dict()
-    #商品描述
-    parameters['body'] = good_name
-    #parameters['body'] = unicode("真老乡","utf-8").encode("utf-8")
-    #商品订单号
-    #订单号后随机加2位 以支持订单过期能支付和改价
-    tmp = random.randint(10,99)
-    parameters['out_trade_no'] = str(order_number)+str(tmp)
-    #parameters['out_trade_no'] = str(order_number)
-    #总价
-    parameters['total_fee'] = str(int(totalpay*100))
-    #支付回调地址
-    parameters['notify_url'] = 'http://www.zhenlaoxiang.com/payment/notify'
-    #交易类型 选用NATIVE
-    #parameters['trade_type'] = 'NATIVE'
-    #parameters['trade_type'] = 'JSAPI'
-    parameters['trade_type'] = 'MWEB'
-
-    #parameters['appid'] = 'wx75c7195d630e2c03'
-    parameters['appid'] = 'wx75c7195d630e2c03'
-
-    #parameters['mch_id'] = '1574308181'
-    parameters['mch_id'] = '1574308181'
-
-    parameters['nonce_str'] = random_str()
-    #parameters['openid'] = openid
-    parameters['spbill_create_ip'] = ip
-    parameters['scene_info'] = json.dumps({"h5_info":{"type":"Wap","wap_url":"http://www.zhenlaoxiang.com","wap_name":u"真老乡"}})
-
-    #生成签名
-    parameters['sign'] = getSign(parameters)
-    #log.debug('weixn_qrcode sign:%s'%parameters['sign'])
-    #print 'sign:',parameters['sign']
-    #把字典转成xml
-    xmlStr = array2Xml(parameters)
-    #print 'pre xmlStr:',xmlStr
-    #log.debug('weixn_qrcode prexmlStr:%s'%xmlStr)
-    #向微信服务器验证
-    veryfiXml = postXmlCurl(xmlStr,"https://api.mch.weixin.qq.com/pay/unifiedorder")
-    #print 'aft xmlStr:',veryfiXml
-    #log.debug('weixn_qrcode aft xmlStr:%s'%veryfiXml)
-    #把xml结果转换成字典 二维码url存放在此
-    qrCodeUrlResultDict = xml2Array(veryfiXml)
-    print qrCodeUrlResultDict
-    
-    if "FAIL" == qrCodeUrlResultDict["return_code"]:
-        print 'return_mdg:',qrCodeUrlResultDict["return_msg"]
-        #log.debug('weixn_qrcode return_mdg:%s'%qrCodeUrlResultDict["return_msg"])
-    elif "FAIL" == qrCodeUrlResultDict["result_code"]:
-        print 'err_code:',qrCodeUrlResultDict["err_code"]
-        #log.debug('weixn_qrcode err_code:%s'%qrCodeUrlResultDict["err_code_des"])
-    elif '' != qrCodeUrlResultDict["mweb_url"]:
-        #log.debug('weixn_qrcode code_url:%s'%qrCodeUrlResultDict["code_url"])
-        qrcode_url = qrCodeUrlResultDict["mweb_url"]
-    else:
-        pass
-    return qrcode_url
-
-if __name__ == "__main__":
-    #print getQrcodeUrl('1212121212121','真老乡',20)
-    print getWxJSPAY('76767777677','真老乡',20,"oa9_x0_mR4_akSUSXsWjQv6fG0iQ","127.0.0.1")
-    #print getWxH5PAY('1212121212121','真老乡',20,"oCF-2v_neXavhH7fqkVnqZADoZTI","127.0.0.1")
-
-
-
-    
-    

+ 0 - 678
src/zkyuan/wzhifuSDK.py

@@ -1,678 +0,0 @@
-#coding:utf-8
-"""
-Created on 2014-11-24
-
-@author: http://blog.csdn.net/yueguanghaidao,yihaibo@longtugame.com
-
- * 微信支付帮助库
- * ====================================================
- * 接口分三种类型:
- * 【请求型接口】--Wxpay_client_
- *      统一支付接口类--UnifiedOrder
- *      订单查询接口--OrderQuery
- *      退款申请接口--Refund
- *      退款查询接口--RefundQuery
- *      对账单接口--DownloadBill
- *      短链接转换接口--ShortUrl
- * 【响应型接口】--Wxpay_server_
- *      通用通知接口--Notify
- *      Native支付——请求商家获取商品信息接口--NativeCall
- * 【其他】
- *      静态链接二维码--NativeLink
- *      JSAPI支付--JsApi
- * =====================================================
- * 【CommonUtil】常用工具:
- *      trimString(),设置参数时需要用到的字符处理函数
- *      createNoncestr(),产生随机字符串,不长于32位
- *      formatBizQueryParaMap(),格式化参数,签名过程需要用到
- *      getSign(),生成签名
- *      arrayToXml(),array转xml
- *      xmlToArray(),xml转 array
- *      postXmlCurl(),以post方式提交xml到对应的接口url
- *      postXmlSSLCurl(),使用证书,以post方式提交xml到对应的接口url
-
-"""
-
-import json
-import time
-import random
-import urllib2
-import hashlib
-import threading
-import urllib
-from urllib import quote
-import xml.etree.ElementTree as ET
-
-try:
-    import pycurl
-    from cStringIO import StringIO
-except ImportError:
-    pycurl = None
-
-
-class WxPayConf_pub(object):
-    """配置账号信息"""
-
-    ##=======【基本信息设置】=====================================
-    ##微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
-    #APPID = "wx566be73406574c97"
-    ##JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
-    #APPSECRET = "59a38d54c22b6ceb8f9bf56561cf2ddb"
-    ##受理商ID,身份标识
-    #MCHID = "1491310452"
-    ##商户支付密钥Key。审核通过后,在微信发送的邮件中查看
-    #KEY = "kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq"
-
-
-    #微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
-    APPID = "wx75c7195d630e2c03"
-    #JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
-    APPSECRET = "614ab3740bdfb4a296cdda71ba8a069d"
-    #受理商ID,身份标识
-    MCHID = "1574308181"
-    #商户支付密钥Key。审核通过后,在微信发送的邮件中查看
-    KEY = "kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq"
-
-
-    ##微信公众号身份的唯一标识。审核通过后,在微信发送的邮件中查看
-    #APPID = "wx84a42c807ed07198"
-    ##JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
-    #APPSECRET = "c707c3e0907316e1c728af48847a6499"
-    ##受理商ID,身份标识
-    #MCHID = "1590893081"
-    ##商户支付密钥Key。审核通过后,在微信发送的邮件中查看
-    #KEY = "kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq"
-
-   
-
-    #=======【异步通知url设置】===================================
-    #异步通知url,商户根据实际开发过程设定
-    NOTIFY_URL = "http://www.zhenlaoxiang.com/payment/notify"
-
-    #=======【JSAPI路径设置】===================================
-    #获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
-    #JS_API_CALL_URL = "http://www.huodongjia.com/pay/?showwxpaytitle=1"
-    JS_API_CALL_URL = "http://www.zhenlaoxiang.com/payment/notify"
-
-    #=======【证书路径设置】=====================================
-    #证书路径,注意应该填写绝对路径
-    SSLCERT_PATH = "/data/web/m_website_dev/m_web/weixinpay/cert/apiclient_cert.pem"
-    SSLKEY_PATH = "/data/web/m_website_dev/m_web/weixinpay/cert/apiclient_key.pem"
-
-    #=======【curl超时设置】===================================
-    CURL_TIMEOUT = 30
-
-    #=======【HTTP客户端设置】===================================
-    HTTP_CLIENT = "URLLIB"  # ("URLLIB", "CURL")
-
-
-class Singleton(object):
-    """单例模式"""
-
-    _instance_lock = threading.Lock()
-
-    def __new__(cls, *args, **kwargs):
-        if not hasattr(cls, "_instance"):
-            with cls._instance_lock:
-                if not hasattr(cls, "_instance"):
-                    impl = cls.configure() if hasattr(cls, "configure") else cls
-                    instance = super(Singleton, cls).__new__(impl, *args, **kwargs)
-                    if not isinstance(instance, cls):
-                        instance.__init__(*args, **kwargs)
-                    cls._instance = instance
-        return cls._instance
-
-
-class UrllibClient(object):
-    """使用urlib2发送请求"""
-
-    def get(self, url, second=30):
-        return self.postXml(None, url, second)
-
-    def post(self,url,data):
-        req = urllib2.Request(url)
-        data = urllib.urlencode(data)
-        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor())
-        response = opener.open(req, data) 
-        return response.read()
-
-    def postXml(self, xml, url, second=30):
-        """不使用证书"""
-        data = urllib2.urlopen(url, xml, timeout=second).read()
-        return data
-
-    def postXmlSSL(self, xml, url, second=30):
-        """使用证书"""
-        raise TypeError("please use CurlClient")
-
-
-class CurlClient(object):
-    """使用Curl发送请求"""
-    def __init__(self):
-        self.curl = pycurl.Curl()
-        self.curl.setopt(pycurl.SSL_VERIFYHOST, False)
-        self.curl.setopt(pycurl.SSL_VERIFYPEER, False)
-        #设置不输出header
-        self.curl.setopt(pycurl.HEADER, False)
-
-    def get(self, url, second=30):
-        return self.postXmlSSL(None, url, second=second, cert=False, post=False)
-
-    def postXml(self, xml, url, second=30):
-        """不使用证书"""
-        return self.postXmlSSL(xml, url, second=second, cert=False, post=True)
-        
-
-    def postXmlSSL(self, xml, url, second=30, cert=True, post=True):
-        """使用证书"""
-        self.curl.setopt(pycurl.URL, url)
-        self.curl.setopt(pycurl.TIMEOUT, second)
-        #设置证书
-        #使用证书:cert 与 key 分别属于两个.pem文件
-        #默认格式为PEM,可以注释
-        if cert:
-            self.curl.setopt(pycurl.SSLKEYTYPE, "PEM")
-            self.curl.setopt(pycurl.SSLKEY, WxPayConf_pub.SSLKEY_PATH)
-            self.curl.setopt(pycurl.SSLCERTTYPE, "PEM")
-            self.curl.setopt(pycurl.SSLCERT, WxPayConf_pub.SSLCERT_PATH)
-        #post提交方式
-        if post:
-            self.curl.setopt(pycurl.POST, True)
-            self.curl.setopt(pycurl.POSTFIELDS, xml)
-        buff = StringIO()
-        self.curl.setopt(pycurl.WRITEFUNCTION, buff.write)
-
-        self.curl.perform()
-        return buff.getvalue()
-
-
-class HttpClient(Singleton):
-    @classmethod
-    def configure(cls):
-        if pycurl is not None and WxPayConf_pub.HTTP_CLIENT != "URLLIB":
-            return CurlClient
-        else:
-            return UrllibClient
-            
-
-class Common_util_pub(object):
-    """所有接口的基类"""
-
-    def trimString(self, value):
-        #if value is not None and len(value) == 0:
-        #    value = None
-        return value
-
-    def createNoncestr(self, length = 32):
-        """产生随机字符串,不长于32位"""
-        chars = "abcdefghijklmnopqrstuvwxyz0123456789"
-        strs = []
-        for x in range(length):
-            strs.append(chars[random.randrange(0, len(chars))])
-        return "".join(strs)
-
-    def formatBizQueryParaMap(self, paraMap, urlencode):
-        """格式化参数,签名过程需要使用"""
-        slist = sorted(paraMap)
-        buff = []
-        for k in slist:
-            v = quote(paraMap[k]) if urlencode else paraMap[k]
-            buff.append("{0}={1}".format(k, v))
-
-        return "&".join(buff)
-
-    def getSign(self, obj):
-        """生成签名"""
-        #签名步骤一:按字典序排序参数,formatBizQueryParaMap已做
-        String = self.formatBizQueryParaMap(obj, False)
-        #签名步骤二:在string后加入KEY
-        String = "{0}&key={1}".format(String,WxPayConf_pub.KEY)
-        print String,22222222222
-        #签名步骤三:MD5加密
-        String = hashlib.md5(String).hexdigest()
-        #签名步骤四:所有字符转为大写
-        result_ = String.upper()
-        print result_,333333333333
-        return result_
-
-    def arrayToXml(self, arr):
-        """array转xml"""
-        xml = ["<xml>"]
-        for k, v in arr.iteritems():
-            xml.append("<{0}>{1}</{0}>".format(k, v))
-            #if v.isdigit():
-            #    xml.append("<{0}>{1}</{0}>".format(k, v))
-            #else:
-            #    xml.append("<{0}>{1}</{0}>".format(k, v))
-        xml.append("</xml>")
-        return "".join(xml)
-
-    def xmlToArray(self, xml):
-        """将xml转为array"""
-        array_data = {}
-        root = ET.fromstring(xml)
-        for child in root:
-            value = child.text
-            array_data[child.tag] = value
-        return array_data
-
-    @staticmethod
-    def XMLToArray(xml):
-        """将xml转为array"""
-        array_data = {}
-        root = ET.fromstring(xml)
-        for child in root:
-            value = child.text
-            array_data[child.tag] = value
-        return array_data
-
-    def postXmlCurl(self, xml, url, second=30):
-        """以post方式提交xml到对应的接口url"""
-        print xml,55555555555555555555
-        return HttpClient().postXml(xml, url, second=second)
-
-    def postXmlSSLCurl(self, xml, url, second=30):
-        """使用证书,以post方式提交xml到对应的接口url"""
-        return HttpClient().postXmlSSL(xml, url, second=second)
-
-
-class JsApi_pub(Common_util_pub):
-    """JSAPI支付——H5网页端调起支付接口"""
-    code = None    #code码,用以获取openid
-    openid = None  #用户的openid
-    parameters = None  #jsapi参数,格式为json
-    prepay_id = None #使用统一支付接口得到的预支付id
-    curl_timeout = None #curl超时时间
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        self.curl_timeout = timeout
-
-    def createOauthUrlForCode(self, redirectUrl):
-        """生成可以获得code的url"""
-        urlObj = {}
-        urlObj["appid"] = WxPayConf_pub.APPID
-        urlObj["redirect_uri"] = redirectUrl
-        urlObj["response_type"] = "code"
-        urlObj["scope"] = "snsapi_base"
-        urlObj["state"] = "STATE#wechat_redirect"
-        bizString = self.formatBizQueryParaMap(urlObj, False)
-        return "https://open.weixin.qq.com/connect/oauth2/authorize?"+bizString
-
-    def createOauthUrlForOpenid(self):
-        """生成可以获得openid的url"""
-        urlObj = {}
-        urlObj["appid"] = WxPayConf_pub.APPID
-        urlObj["secret"] = WxPayConf_pub.APPSECRET
-        urlObj["code"] = self.code
-        urlObj["grant_type"] = "authorization_code"
-        bizString = self.formatBizQueryParaMap(urlObj, False)
-        return "https://api.weixin.qq.com/sns/oauth2/access_token?"+bizString
-
-    def getOpenid(self):
-        """通过curl向微信提交code,以获取openid"""
-        url = self.createOauthUrlForOpenid()
-        data = HttpClient().get(url)
-        print data
-        self.openid = json.loads(data)["openid"]
-        return self.openid
-        
-    
-    def setPrepayId(self, prepayId):
-        """设置prepay_id"""
-        self.prepay_id = prepayId
-
-    def setCode(self, code):
-        """设置code"""
-        self.code = code
-
-    def  getParameters(self):
-        """设置jsapi的参数"""
-        jsApiObj = {}
-        jsApiObj["appId"] = WxPayConf_pub.APPID
-        timeStamp = int(time.time())
-        jsApiObj["timeStamp"] = "{0}".format(timeStamp)
-        jsApiObj["nonceStr"] = self.createNoncestr()
-        jsApiObj["package"] = "prepay_id={0}".format(self.prepay_id)
-        jsApiObj["signType"] = "MD5"
-        jsApiObj["paySign"] = self.getSign(jsApiObj)
-        self.parameters = json.dumps(jsApiObj)
-
-        return self.parameters
-
-
-class Wxpay_client_pub(Common_util_pub):
-    """请求型接口的基类"""
-    response = None  #微信返回的响应
-    url = None       #接口链接
-    curl_timeout = None #curl超时时间
-
-    def __init__(self):
-        self.parameters = {} #请求参数,类型为关联数组
-        self.result = {}     #返回参数,类型为关联数组
-
-
-    def setParameter(self, parameter, parameterValue):
-        """设置请求参数"""
-        self.parameters[self.trimString(parameter)] = self.trimString(parameterValue)
-
-    def createXml(self):
-        """设置标配的请求参数,生成签名,生成接口参数xml"""
-        #self.parameters["appid"] = WxPayConf_pub.APPID   #公众账号ID
-        #self.parameters["mch_id"] = WxPayConf_pub.MCHID   #商户号
-        #self.parameters["nonce_str"] = self.createNoncestr()   #随机字符串
-        #self.parameters["sign"] = self.getSign(self.parameters)   #签名
-        return  self.arrayToXml(self.parameters)
-
-    def postXml(self):
-        """post请求xml"""
-        xml = self.createXml()
-        self.response = self.postXmlCurl(xml, self.url, self.curl_timeout)
-        print self.postXmlCurl(xml, self.url, self.curl_timeout),444444444444444444444444444444
-        return self.response
-
-    def postXmlSSL(self):
-        """使用证书post请求xml"""
-        xml = self.createXml()
-        self.response = self.postXmlSSLCurl(xml, self.url, self.curl_timeout)
-        return self.response
-
-    def getResult(self):
-        """获取结果,默认不使用证书"""
-        self.postXml()
-        self.result = self.xmlToArray(self.response)
-        return self.result
-
-
-class UnifiedOrder_pub(Wxpay_client_pub):
-    """统一支付接口类"""
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        #设置接口链接
-        self.url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
-        #设置curl超时时间
-        self.curl_timeout = timeout
-        super(UnifiedOrder_pub, self).__init__()
-
-
-    def createXml(self):
-        """生成接口参数xml"""
-        #检测必填参数
-        if any(self.parameters[key] is None for key in ("out_trade_no", "body", "total_fee", "notify_url", "trade_type")):
-            raise ValueError("missing parameter")
-        if self.parameters["trade_type"] == "JSAPI" and self.parameters["openid"] is None:
-            raise ValueError("JSAPI need openid parameters")
-
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        self.parameters["spbill_create_ip"] = "127.0.0.1"  #终端ip      
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名
-        print self.parameters,11111111111111
-        return  self.arrayToXml(self.parameters)
-
-    def getPrepayId(self):
-        """获取prepay_id"""
-        self.postXml()
-        self.result = self.xmlToArray(self.response)
-        print self.result,99999999999999999
-        prepay_id = self.result["prepay_id"]
-        return prepay_id
-
-    def geth5url(self):
-        """获取prepay_id"""
-        self.postXml()
-        self.result = self.xmlToArray(self.response)
-        print self.result,99999999999999999
-        prepay_id = self.result["mweb_url"]
-        return prepay_id
-
-
-class OrderQuery_pub(Wxpay_client_pub):
-    """订单查询接口"""
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        #设置接口链接
-        self.url = "https://api.mch.weixin.qq.com/pay/orderquery"
-        #设置curl超时时间
-        self.curl_timeout = timeout
-        super(OrderQuery_pub, self).__init__()
-
-    def createXml(self):
-        """生成接口参数xml"""
-
-        #检测必填参数
-        if any(self.parameters[key] is None for key in ("out_trade_no", "transaction_id")):
-            raise ValueError("missing parameter")
-
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名
-        return  self.arrayToXml(self.parameters)
-
-
-class Refund_pub(Wxpay_client_pub):
-    """退款申请接口"""
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        #设置接口链接
-        self.url = "https://api.mch.weixin.qq.com/secapi/pay/refund"
-        #设置curl超时时间
-        self.curl_timeout = timeout
-        super(Refund_pub, self).__init__()
-
-    def createXml(self):
-        """生成接口参数xml"""
-        if any(self.parameters[key] is None for key in ("out_trade_no", "out_refund_no", "total_fee", "refund_fee", "op_user_id")):
-            raise ValueError("missing parameter")
-
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名
-        return  self.arrayToXml(self.parameters)
-
-    def getResult(self):
-        """ 获取结果,使用证书通信(需要双向证书)"""
-        self.postXmlSSL()
-        self.result = self.xmlToArray(self.response)
-        return self.result
-
-
-class RefundQuery_pub(Wxpay_client_pub):
-    """退款查询接口"""
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        #设置接口链接
-        self.url = "https://api.mch.weixin.qq.com/pay/refundquery"
-        #设置curl超时时间
-        self.curl_timeout = timeout
-        super(RefundQuery_pub, self).__init__()
-
-    def createXml(self):
-        """生成接口参数xml"""
-        if any(self.parameters[key] is None for key in ("out_refund_no", "out_trade_no", "transaction_id", "refund_id")):
-            raise ValueError("missing parameter")
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名
-        return  self.arrayToXml(self.parameters)
-
-    def getResult(self):
-        """ 获取结果,使用证书通信(需要双向证书)"""
-        self.postXmlSSL()
-        self.result = self.xmlToArray(self.response)
-        return self.result
-
-
-class DownloadBill_pub(Wxpay_client_pub):
-    """对账单接口"""
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        #设置接口链接
-        self.url = "https://api.mch.weixin.qq.com/pay/downloadbill"
-        #设置curl超时时间
-        self.curl_timeout = timeout
-        super(DownloadBill_pub, self).__init__()
-
-    def createXml(self):
-        """生成接口参数xml"""
-        if any(self.parameters[key] is None for key in ("bill_date", )):
-            raise ValueError("missing parameter")
-
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名
-        return  self.arrayToXml(self.parameters)
-
-    def getResult(self):
-        """获取结果,默认不使用证书"""
-        self.postXml()
-        self.result = self.xmlToArray(self.response)
-        return self.result
-
-
-class ShortUrl_pub(Wxpay_client_pub):
-    """短链接转换接口"""
-
-    def __init__(self, timeout=WxPayConf_pub.CURL_TIMEOUT):
-        #设置接口链接
-        self.url = "https://api.mch.weixin.qq.com/tools/shorturl"
-        #设置curl超时时间
-        self.curl_timeout = timeout
-        super(ShortUrl_pub, self).__init__()
-
-    def createXml(self):
-        """生成接口参数xml"""
-        if any(self.parameters[key] is None for key in ("long_url", )):
-            raise ValueError("missing parameter")
-
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名
-        return  self.arrayToXml(self.parameters)
-
-    def getShortUrl(self):
-        """获取prepay_id"""
-        self.postXml()
-        prepay_id = self.result["short_url"]
-        return prepay_id
-
-
-
-class Wxpay_server_pub(Common_util_pub):
-    """响应型接口基类"""
-    SUCCESS, FAIL = "SUCCESS", "FAIL"
-
-    def __init__(self):
-        self.data = {}  #接收到的数据,类型为关联数组
-        self.returnParameters = {} #返回参数,类型为关联数组
-
-    def saveData(self, xml):
-        """将微信的请求xml转换成关联数组,以方便数据处理"""
-        self.data = self.xmlToArray(xml)
-
-    def checkSign(self):
-        """校验签名"""
-        tmpData = dict(self.data) #make a copy to save sign
-        del tmpData['sign']
-        sign = self.getSign(tmpData) #本地签名
-        if self.data['sign'] == sign:
-            return True
-        return False
-
-    def getData(self):
-        """获取微信的请求数据"""
-        return self.data
-
-    def setReturnParameter(self, parameter, parameterValue):
-        """设置返回微信的xml数据"""
-        self.returnParameters[self.trimString(parameter)] = self.trimString(parameterValue)
-
-    def createXml(self):
-        """生成接口参数xml"""
-        return self.arrayToXml(self.returnParameters)
-
-    def returnXml(self):
-        """将xml数据返回微信"""
-        returnXml = self.createXml()
-        return returnXml
-
-
-class Notify_pub(Wxpay_server_pub):
-    """通用通知接口"""
-    
-
-
-class NativeCall_pub(Wxpay_server_pub):
-    """请求商家获取商品信息接口"""
-
-    def createXml(self):
-        """生成接口参数xml"""
-        if self.returnParameters["return_code"] == self.SUCCESS:
-            self.returnParameters["appid"] = WxPayConf_pub.APPID #公众账号ID
-            self.returnParameters["mch_id"] = WxPayConf_pub.MCHID #商户号
-            self.returnParameters["nonce_str"] = self.createNoncestr() #随机字符串
-            self.returnParameters["sign"] = self.getSign(self.returnParameters) #签名
-
-        return self.arrayToXml(self.returnParameters)
-
-    def getProductId(self):
-        """获取product_id"""
-        product_id = self.data["product_id"]
-        return product_id
-
-
-class NativeLink_pub(Common_util_pub):
-    """静态链接二维码"""
-
-    url = None #静态链接
-
-    def __init__(self):
-        self.parameters = {} #静态链接参数
-
-    def setParameter(self, parameter, parameterValue):
-        """设置参数"""
-        self.parameters[self.trimString(parameter)] = self.trimString(parameterValue)
-
-    def createLink(self):
-        if any(self.parameters[key] is None for key in ("product_id", )):
-            raise ValueError("missing parameter")
-
-        self.parameters["appid"] = WxPayConf_pub.APPID  #公众账号ID
-        self.parameters["mch_id"] = WxPayConf_pub.MCHID  #商户号
-        time_stamp = int(time.time())
-        self.parameters["time_stamp"] = "{0}".format(time_stamp)  #时间戳
-        self.parameters["nonce_str"] = self.createNoncestr()  #随机字符串
-        self.parameters["sign"] = self.getSign(self.parameters)  #签名          
-        bizString = self.formatBizQueryParaMap(self.parameters, False)
-        self.url = "weixin://wxpay/bizpayurl?"+bizString
-
-    def getUrl(self):
-        """返回链接"""
-        self.createLink()
-        return self.url
-
-
-def test():
-    c = HttpClient()
-    assert c.get("http://www.baidu.com")[:15] == "<!DOCTYPE html>"
-    c2 = HttpClient()
-    assert id(c) == id(c2)
-
-
-
-if __name__ == "__main__":
-    par_obj = UnifiedOrder_pub()
-    par_obj.setParameter('out_trade_no','1448936301')
-    par_obj.setParameter('body','test')
-    par_obj.setParameter('total_fee','1800')
-    par_obj.setParameter('notify_url','1111111111')
-    par_obj.setParameter('trade_type','JSAPI')
-    par_obj.setParameter('openid','ow7pX46fM1xAVgCHH5eNcxkurRks')
-    par_obj.createXml()
-
-    print par_obj.getPrepayId()

BIN
static/upload/1627651115avatar.jpg


BIN
static/upload/1627651211696.jpg


BIN
static/upload/1627709312570.png


BIN
static/upload/1627709513870.png


BIN
static/upload/1627709639287.png


BIN
static/upload/1627709699418.png


BIN
static/upload/1627709710436.png


BIN
static/upload/1627709906546.png


BIN
static/upload/1627710028763.png


BIN
static/upload/1627710033814.png


BIN
static/upload/1627710066268.png


BIN
static/upload/1627711038264.png


BIN
static/upload/1627721412065.jpg


BIN
static/upload/1627721951930.jpg


BIN
static/upload/1627722019678.jpg


BIN
static/upload/1627735531wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.NK79UQIogbBj972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627735745wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.pMLTM9YqBb9M972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627735791wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.tgep9xOorenY972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627735838wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.H4S8cstZ2mKL972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627735895wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.wbe7bQn8ca4x4937eb3d39d8d2dea41120630a599ec4.png


BIN
static/upload/1627735965wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.8s834l54thAa972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627735996wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.pLDXb15gLr3r402382246a2065cee3c3007b24c5c58b.png


BIN
static/upload/1627736021wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.pYTgp6IyEMCe401b2930b2e029af60026d7086792265.png


BIN
static/upload/1627736104wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.162lsN5XrDQW972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627736115wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.H3oH0etdLBroe64d82b4c534154fd7dd596bf3b48923.png


BIN
static/upload/1627736248wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.Lqc3At7s75FJ972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627736254wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.6lUqK0btk8QCe64d82b4c534154fd7dd596bf3b48923.png


BIN
static/upload/1627736316wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.OdsMMx21C6Dw972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627736323wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.to9s9oFwBODHe64d82b4c534154fd7dd596bf3b48923.png


BIN
static/upload/1627736618wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.DMQkGT1NplCK972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627736701wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.RJ7uEnPuLTmBe64d82b4c534154fd7dd596bf3b48923.png


BIN
static/upload/1627736971wx2938132b773c7b5a.o6zAJs6ak3UlDDc6i7VvXIk4HK98.JLyn4C4BtJYc972864c4400d0d2cd6758af218cfa843.png


BIN
static/upload/1627737199tmp_d9b8dff98c757f955c00483b4e61ec43.jpg


BIN
static/upload/1627775046644.jpg


BIN
static/upload/1627776851436.jpg


BIN
static/upload/1627776945261.jpg


BIN
static/upload/1627777070703.jpg


BIN
static/upload/1627777192640.jpg


BIN
static/upload/1627777303573.jpg


BIN
static/upload/1627777473334.jpg


+ 0 - 0
static/upload/1627777516142.jpg


Some files were not shown because too many files changed in this diff