Gogs пре 4 година
родитељ
комит
28c5960574
100 измењених фајлова са 2882 додато и 152 уклоњено
  1. 2 2
      src/account/control_user.py
  2. 61 4
      src/api/controls.py
  3. 6 0
      src/api/urls_backstage.py
  4. 138 2
      src/api/views.py
  5. 1 1
      src/common/common_functions.py
  6. 5 2
      src/common/core_views.py
  7. 63 26
      src/common/models.py
  8. 0 1
      src/common/views.py
  9. 1 1
      src/manage.py
  10. 602 54
      src/manage/controls.py
  11. 43 2
      src/manage/urls_backstage.py
  12. 1585 3
      src/manage/views.py
  13. 1 1
      src/settings/__init__.py
  14. 1 1
      src/settings/base.py
  15. 5 5
      src/settings/settings_dev.py
  16. 6 23
      src/settings/settings_online.py
  17. 3 0
      src/settings_dev/__init__.py
  18. 126 0
      src/settings_dev/base.py
  19. 63 0
      src/settings_dev/settings_dev.py
  20. 63 0
      src/settings_dev/settings_online.py
  21. 7 23
      src/utils/aliyun_sms.py
  22. 21 1
      src/utils/qrcodetool.py
  23. 57 0
      src/utils/wxmp.py
  24. 22 0
      src/wsgi_dev.py
  25. BIN
      static/survey_bg.jpg
  26. BIN
      static/upload/survey_bg_108.jpg
  27. BIN
      static/upload/survey_bg_109.jpg
  28. BIN
      static/upload/survey_bg_110.jpg
  29. BIN
      static/upload/survey_bg_111.jpg
  30. BIN
      static/upload/survey_bg_112.jpg
  31. BIN
      static/upload/survey_bg_113.jpg
  32. BIN
      static/upload/survey_bg_114.jpg
  33. BIN
      static/upload/survey_bg_115.jpg
  34. BIN
      static/upload/survey_bg_116.jpg
  35. BIN
      static/upload/survey_bg_117.jpg
  36. BIN
      static/upload/survey_bg_118.jpg
  37. BIN
      static/upload/survey_bg_119.jpg
  38. BIN
      static/upload/survey_bg_120.jpg
  39. BIN
      static/upload/survey_bg_121.jpg
  40. BIN
      static/upload/survey_bg_122.jpg
  41. BIN
      static/upload/survey_bg_123.jpg
  42. BIN
      static/upload/survey_bg_124.jpg
  43. BIN
      static/upload/survey_bg_125.jpg
  44. BIN
      static/upload/survey_bg_126.jpg
  45. BIN
      static/upload/survey_bg_127.jpg
  46. BIN
      static/upload/survey_bg_128.jpg
  47. BIN
      static/upload/survey_bg_129.jpg
  48. BIN
      static/upload/survey_bg_130.jpg
  49. BIN
      static/upload/survey_bg_131.jpg
  50. BIN
      static/upload/survey_bg_132.jpg
  51. BIN
      static/upload/survey_bg_133.jpg
  52. BIN
      static/upload/survey_bg_134.jpg
  53. BIN
      static/upload/survey_bg_135.jpg
  54. BIN
      static/upload/survey_bg_136.jpg
  55. BIN
      static/upload/survey_bg_137.jpg
  56. BIN
      static/upload/survey_bg_138.jpg
  57. BIN
      static/upload/survey_bg_139.jpg
  58. BIN
      static/upload/survey_bg_140.jpg
  59. BIN
      static/upload/survey_bg_141.jpg
  60. BIN
      static/upload/survey_bg_142.jpg
  61. BIN
      static/upload/survey_bg_143.jpg
  62. BIN
      static/upload/survey_bg_144.jpg
  63. BIN
      static/upload/survey_bg_145.jpg
  64. BIN
      static/upload/survey_bg_146.jpg
  65. BIN
      static/upload/survey_bg_147.jpg
  66. BIN
      static/upload/survey_bg_148.jpg
  67. BIN
      static/upload/survey_bg_149.jpg
  68. BIN
      static/upload/survey_bg_150.jpg
  69. BIN
      static/upload/survey_bg_151.jpg
  70. BIN
      static/upload/survey_bg_152.jpg
  71. BIN
      static/upload/survey_bg_153.jpg
  72. BIN
      static/upload/survey_bg_154.jpg
  73. BIN
      static/upload/survey_bg_155.jpg
  74. BIN
      static/upload/survey_bg_156.jpg
  75. BIN
      static/upload/survey_bg_157.jpg
  76. BIN
      static/upload/survey_bg_158.jpg
  77. BIN
      static/upload/survey_bg_159.jpg
  78. BIN
      static/upload/survey_bg_160.jpg
  79. BIN
      static/upload/survey_bg_161.jpg
  80. BIN
      static/upload/survey_bg_162.jpg
  81. BIN
      static/upload/survey_bg_163.jpg
  82. BIN
      static/upload/survey_bg_164.jpg
  83. BIN
      static/upload/survey_bg_165.jpg
  84. BIN
      static/upload/survey_bg_166.jpg
  85. BIN
      static/upload/survey_bg_167.jpg
  86. BIN
      static/upload/survey_bg_168.jpg
  87. BIN
      static/upload/survey_bg_169.jpg
  88. BIN
      static/upload/survey_bg_170.jpg
  89. BIN
      static/upload/survey_bg_171.jpg
  90. BIN
      static/upload/survey_bg_172.jpg
  91. BIN
      static/upload/survey_bg_173.jpg
  92. BIN
      static/upload/survey_bg_174.jpg
  93. BIN
      static/upload/survey_bg_175.jpg
  94. BIN
      static/upload/survey_bg_176.jpg
  95. BIN
      static/upload/survey_bg_177.jpg
  96. BIN
      static/upload/survey_bg_178.jpg
  97. BIN
      static/upload/survey_bg_179.jpg
  98. BIN
      static/upload/survey_bg_180.jpg
  99. BIN
      static/upload/survey_bg_181.jpg
  100. 0 0
      templates/answer.html

+ 2 - 2
src/account/control_user.py

@@ -77,8 +77,8 @@ 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_id = info.get('imgcode_id')
+    idcode = info.get('imgcode')
     captcha = cache.get(captcha_id, '')
     cache.delete(captcha_id)
     if not username or not password:

+ 61 - 4
src/api/controls.py

@@ -28,6 +28,8 @@ import xlrd
 import xlwt
 from xlutils.copy import copy
 from xltpl.writer import BookWriter
+from utils.qrcodetool import gen_cus_qrcode_img
+from utils.upload_to_oss import TedOSS
 
 
 
@@ -57,7 +59,7 @@ def delete_model(cls,**kwargs):
     rst = model.objects.filter(id__in=ids).delete()
     return ids
 
-def get_detail_info(cls,**kwargs):
+def get_model_detail_info(cls,**kwargs):
     """
     """
     model_name = re.search(r'.*\.(\w+)View',str(cls.__class__)).groups()[0]
@@ -65,8 +67,13 @@ 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 == "GreenHouse":
-        rst["device_list"] = json.loads(rst["device_list"])
+    if model_name == "Hotel":
+        rooms = list(cm.Room.objects.filter(hotel_id=id).values())
+        for r in rooms:
+            print r["imgs"],11111111111111
+            img = json.loads(r["imgs"])[0] if r["imgs"] else ""
+            r["img"] = img
+        rst["rooms"] = rooms
     return rst
 
 def get_list_info(cls,**kwargs):
@@ -78,6 +85,17 @@ def get_list_info(cls,**kwargs):
     if kwargs.get("name"):
         qset = qset.filter(name__icontains=kwargs.get("name"))
     data = list(qset.values())
+    if model_name == "Conference":
+        for item in data:
+            item["conference_img"] = cm.Conference.objects.filter(id=item["conference_id"]).first().img
+    if model_name == "Signup":
+        for item in data:
+            item["conference_img"] = cm.Conference.objects.filter(id=item["conference_id"]).first().img
+    if model_name == "Hotel":
+        for item in data:
+            pass
+            #imgs = json.loads(item["imgs"]) if item["imgs"] else []
+            #item["img"] = imgs[0] if imgs else ""
     page = int(kwargs.get("page",0))
     page_size = int(kwargs.get("page_size",20))
     if page and page_size:
@@ -153,7 +171,6 @@ def get_index_journals(request):
         journals = list(filter(lambda x:x["ename"].startswith(c),journals))
         if journals:
             ret.append({"lower":c.lower(),"name":c,"journals":journals})
-    print ret,99999
     return ret
 
 def get_index_organizers(request):
@@ -538,6 +555,37 @@ def get_user_collection(request):
 def do_signup(request):
     """
     """
+    qdata = request.json
+    need_params = ["conference_id","conference_name","name","sex","age","job",
+        "title","is_caos","organizer_unit","phone","email"]
+    vals = ccf.get_need_params(*need_params,**qdata)
+    vals["user_id"] = qdata.get("uid") 
+    obj = cm.Signup.objects.create(**vals)
+    return obj.id
+
+
+def update_signup(request):
+    """
+    """
+    qdata = request.json
+    need_params = ["proof_img","paytype","billtype","billhead","billno",
+        "billaddress","billphone","billbank","billbankno","hotel_id","room_id",
+        "room_nums","room_stime","room_etime"]
+    vals = ccf.get_need_params(*need_params,**qdata)
+    id = qdata.get("id")
+    cm.Signup.objects.filter(id=id).update(**vals)
+    obj = cm.Signup.objects.filter(id=id).first()
+    if vals.get("proof_img") and vals.get("paytype"):
+        obj.signup_status = 1
+    if vals.get("hotel_id") and vals.get("room_id"):
+        obj.signup_status = 3
+        #生成核销二维码
+        url = settings.HOST+"/xcx/verify?sid=%s" % obj.id
+        imgname = gen_cus_qrcode_img(url,"/tmp/signup_%s.png" % obj.id)
+        oss = TedOSS()
+        verify_qrcode = oss.upload_from_local(imgname,"zky/signup_%s.png"%obj.id)
+        obj.verify_qrcode = verify_qrcode
+    obj.save()
     return True
 
 
@@ -565,5 +613,14 @@ def get_organiztion_list(request):
     return data
 
 
+def verify_signup(request):
+    """
+    """
+    qdata = request.json
+    need_params = ["sid","uid"]
+    vals = ccf.get_need_params(*need_params,**qdata)
+    id = qdata.get("sid")
+    obj = cm.Signup.objects.filter(id=id).update(signup_status=4)
+    return True
 
 

+ 6 - 0
src/api/urls_backstage.py

@@ -25,7 +25,13 @@ urlpatterns = [
     url(r'^collect$', views.CollectView.as_view()),
     url(r'^user/collection$', views.UserCollectionView.as_view()),
     url(r'^user/signup$', views.UserSignupView.as_view()),
+    url(r'^user/signup/list$', views.SignupListView.as_view()),
     url(r'^organization/list$', views.OrganizationListView.as_view()),
+    url(r'^signup/hotel/list$', views.HotelListView.as_view()),
+    url(r'^signup/hotel$', views.HotelView.as_view()),
+    url(r'^uploadfile$', views.UploadFileView.as_view()),
+    url(r'^signup/verify$', views.SignupVerifyView.as_view()),
+    url(r'^phcode$', views.GetPhoneCodeView.as_view()),
 
 
 ]

+ 138 - 2
src/api/views.py

@@ -17,6 +17,7 @@ import common.common_control as ccc
 import common.common_functions as ccf
 from utils.cloopen_sms import cloopensms
 import control_auth as ca
+from utils.aliyun_sms import send_sms
 
 APPID = "wx2938132b773c7b5a" 
 APPSECRET = "1707d86ef4d9894775ebac21d87390e6"
@@ -288,7 +289,7 @@ class EmergencyResourceView(cv.AuthView):
             raise ce.TipException(mse)
         try:
             vals = ccf.get_need_params(*need_params,**qdata)
-            rst = ctl.get_detail_info(self,**vals)
+            rst = ctl.get_model_detail_info(self,**vals)
             return cv.to_suc(rst)
         except Exception as e:
             cv.tracefail()
@@ -464,7 +465,7 @@ class UploadFileView(cv.AuthView):
         @type:"",前端自定义参数
         """
         try:
-            rst = ccc.upload_file(request)
+            rst = ccc.upload_to_oss(request)
             return cv.to_suc(rst)
         except Exception as e:
             cv.tracefail()
@@ -647,6 +648,7 @@ class RecommendView(cv.BaseView):
             rst = ctl.recommend(request)
             return cv.to_suc(rst)
         except Exception as e: 
+            cv.tracefail()
             return cv.to_fail(e)
 
 
@@ -724,6 +726,7 @@ class UserSignupView(cv.BaseView):
         """#提交报名信息(小程序)
         @uid:uid
         @conference_id:会议id
+        @conference_name:会议名称
         @name:姓名
         @sex:1/2
         @age:年龄
@@ -740,6 +743,81 @@ class UserSignupView(cv.BaseView):
         except Exception as e: 
             return cv.to_fail(e)
 
+    def put(self, request):
+        """#上传凭证和选酒店(小程序)
+        @id:报名id
+        @proof_img:汇款凭证
+        @paytype:1/2,支付方式
+        @billtype:1/2,发票种类
+        @billhead:发票抬头
+        @billno:纳税人识别号
+        @billaddress:注册地址
+        @billphone:注册电话
+        @billbank:开户银行
+        @billbankno:开户银行账号
+        @hotel_id:酒店id
+        @room_id:房间id
+        @room_nums:入驻人数
+        @room_stime:入驻开始时间
+        @room_etime:入驻结束时间
+        """
+        try:
+            rst = ctl.update_signup(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            return cv.to_fail(e)
+
+class SignupListView(cv.BaseView):
+    def get(self, request):
+        """#报名列表(小程序)
+        @uid:1,用户id
+        @type:1/2,未开始/已结束
+        @page:1
+        @page_size:10
+        """
+        try:
+            qdata = request.json
+            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 HotelListView(cv.BaseView):
+    def get(self, request):
+        """#酒店列表(小程序)
+        @conference_id:1,会议id
+        @page:1
+        @page_size:10
+        """
+        try:
+            qdata = request.json
+            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 HotelView(cv.BaseView):
+    def get(self, request):
+        """#酒店详情(小程序)
+        @id:1,酒店id
+        """
+        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_model_detail_info(self,**vals)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
 class OrganizationListView(cv.BaseView):
     def get(self, request):
         """#中科院单位列表(小程序)
@@ -749,3 +827,61 @@ class OrganizationListView(cv.BaseView):
             return cv.to_suc(rst)
         except Exception as e: 
             return cv.to_fail(e)
+
+class UploadFileView(cv.BaseView):
+    def post(self, request):
+        """
+        #文件上传(平台管理后台)
+        @file:"",文件对象
+        @type:"",前端自定义参数
+        """
+        try:
+            #rst = ccc.upload_file(request)
+            rst = ccc.upload_to_oss(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class SignupVerifyView(cv.BaseView):
+    def post(self, request):
+        """#核销报名信息(小程序)
+        @uid:uid
+        @sid:1,报名id
+        """
+        try:
+            rst = ctl.verify_signup(request)
+            return cv.to_suc(rst)
+        except Exception as e: 
+            return cv.to_fail(e)
+
+
+class GetPhoneCodeView(cv.BaseView):
+    def send_resetpwd_code_msg(self,phone,content,template_id="SMS_190465337"):
+        """重置密码短信验证码
+        """
+        #if settings.SEND_SMS:
+        rst,msg = send_sms(phone,content,template_id)
+        return rst,msg
+
+    def post(self, request):
+        """#获取短信验证码
+        @phone:"15982456282",手机号
+        """
+        #uid = request.user.id
+        qdata = request.json
+        phone = qdata.get("phone","")
+        codetype = qdata.get("type")
+        rcode = "".join(random.sample('1234567890',6))
+        valid_time = 60*2
+
+        if codetype == "changephone":
+            rst,msg = self.send_resetpwd_code_msg(phone,rcode,"SMS_190465337")
+        else:
+            rst,msg = self.send_resetpwd_code_msg(phone,rcode)
+        if rst:
+            cache.set(phone,rcode,valid_time)
+            return cv.to_suc({})
+        else:
+            return cv.to_fail(msg)

+ 1 - 1
src/common/common_functions.py

@@ -219,7 +219,7 @@ def get_weathear_by_city(district_id):
     return None
 
 if __name__ == "__main__":
-    print make_password("root")
+    print make_password("123456")
     pass
 
 

+ 5 - 2
src/common/core_views.py

@@ -1,12 +1,14 @@
 #coding=utf-8
 '''
 '''
+import uuid
 import json
 import logging
 import re
 import traceback
 import datetime
 import hashlib
+import decimal
 from utils.aestool import aescbc
 
 from django import http
@@ -19,6 +21,7 @@ from django.views import View
 from django.views.decorators.csrf import csrf_exempt
 from django.core.serializers.json import DjangoJSONEncoder
 import user_agents
+from django.utils.functional import Promise
 
 from common import error_info
 from common.models import UserInfo,SysUserInfo
@@ -54,8 +57,8 @@ class CusDjangoJSONEncoder(json.JSONEncoder):
             return str(o)
         elif isinstance(o, Promise):
             return six.text_type(o)
-        elif isinstance(o, CallableBool):
-            return bool(o)
+        #elif isinstance(o, CallableBool):
+        #    return bool(o)
         else:
             return super(DjangoJSONEncoder, self).default(o)
 

+ 63 - 26
src/common/models.py

@@ -9,6 +9,7 @@ class Journal(models.Model):
     journal_id = models.CharField(u"单位id",max_length=50,blank=True,null=True)
     #organizer_id = models.IntegerField(u"学科id",blank=True,null=True)
     subject_id = models.IntegerField(u"学科id",blank=True,null=True)
+    organizer_id = models.IntegerField(u"主办单位",blank=True,null=True)
     name = models.CharField(u"期刊名称",max_length=50)
     cname = models.CharField(u"期刊中文名称",max_length=255)
     ename = models.CharField(u"期刊英文名称",max_length=255)
@@ -127,9 +128,9 @@ class HotWord(models.Model):
     name = models.CharField(u"期刊名称",max_length=50)
     is_active = models.SmallIntegerField(u"状态",default=1)
 
-    status = models.SmallIntegerField(u"状态",default=1)
+    cid = models.IntegerField(u"创建人id")
+    cname = models.CharField(u"创建人",max_length=50)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
-    uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
 
     class Meta:
         db_table = "ted_hotword"
@@ -142,9 +143,9 @@ class ColdWord(models.Model):
     name = models.CharField(u"期刊名称",max_length=50)
     is_active = models.SmallIntegerField(u"状态",default=1)
 
-    status = models.SmallIntegerField(u"状态",default=1)
+    cid = models.IntegerField(u"创建人id")
+    cname = models.CharField(u"创建人",max_length=50)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
-    uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
 
     class Meta:
         db_table = "ted_coldword"
@@ -157,9 +158,9 @@ class SenWord(models.Model):
     name = models.CharField(u"期刊名称",max_length=50)
     is_active = models.SmallIntegerField(u"状态",default=1)
 
-    status = models.SmallIntegerField(u"状态",default=1)
+    cid = models.IntegerField(u"创建人id")
+    cname = models.CharField(u"创建人",max_length=50)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
-    uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
 
     class Meta:
         db_table = "ted_senword"
@@ -170,9 +171,10 @@ class Banners(models.Model):
     """Banner位
     """
     name = models.CharField(u"广告名称", max_length=255, blank=True,null=True)
-    img = models.CharField(u"跳转链接", max_length=255, blank=True,null=True)
+    img = models.TextField(u"封面图", max_length=255, blank=True,null=True)
     url = models.TextField(u"跳转链接", max_length=255, blank=True,null=True)
     is_active = models.SmallIntegerField(u"状态",default=1)
+    is_jump = models.SmallIntegerField(u"是否跳转",default=0)
 
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
@@ -188,7 +190,7 @@ class Conference(models.Model):
 
     name = models.CharField(u"期刊名称",max_length=255)
     img = models.TextField(u"封面图片")
-    organizer_id = models.IntegerField(u"学科id",blank=True,null=True)
+    organizer_id = models.IntegerField(u"主办方id",blank=True,null=True)
     begin_time = models.DateTimeField(u"创建时间", auto_now_add=True)
     end_time = models.DateTimeField(u"创建时间", auto_now_add=True)
     city = models.CharField(u"市",max_length=50)
@@ -205,8 +207,8 @@ class Conference(models.Model):
     status = models.SmallIntegerField(u"状态",default=1)
     cid = models.IntegerField(u"创建人id")
     cname = models.CharField(u"创建人",max_length=50)
-    upid = models.IntegerField(u"创建人id")
-    upname = models.CharField(u"修改人",max_length=50)
+    upid = models.IntegerField(u"创建人id",blank=True,null=True)
+    upname = models.CharField(u"修改人",max_length=50,blank=True,null=True)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
     uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
 
@@ -215,6 +217,25 @@ class Conference(models.Model):
         verbose_name = u"会议信息"
         app_label = "common"
 
+class Verifier(models.Model):
+    """核销员
+    """
+    conference_id = models.IntegerField(u"会议id")
+    conference_name = models.CharField(u"会议名称",max_length=255)
+    user_id = models.IntegerField(u"用户id")
+    user_name = models.CharField(u"期刊名称",max_length=255)
+    user_avatar = models.CharField(u"用户头像",max_length=255)
+
+    status = models.SmallIntegerField(u"状态",default=1)
+    cid = models.IntegerField(u"创建人id")
+    cname = models.CharField(u"创建人",max_length=50)
+    ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
+    uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
+
+    class Meta:
+        db_table = "ted_verifier"
+        verbose_name = u"核销员"
+        app_label = "common"
 
 class Activity(models.Model):
     """活动
@@ -222,10 +243,10 @@ class Activity(models.Model):
     journal_id = models.IntegerField(u"期刊id",default=0)
     activity_id = models.CharField(u"会议id",max_length=50,blank=True,null=True)
 
-    name = models.CharField(u"期刊名称",max_length=50)
+    name = models.CharField(u"活动名称",max_length=50)
     img = models.TextField(u"封面图片")
-    begin_time = models.DateTimeField(u"创建时间", auto_now_add=True)
-    end_time = models.DateTimeField(u"创建时间", auto_now_add=True)
+    begin_time = models.DateTimeField(u"开始时间", auto_now_add=True)
+    end_time = models.DateTimeField(u"结束时间", auto_now_add=True)
     desc = models.TextField(u"简介")
     province = models.CharField(u"省",max_length=50)
     city = models.CharField(u"市",max_length=50)
@@ -236,6 +257,9 @@ class Activity(models.Model):
     is_recommend = models.SmallIntegerField(u"是否推荐",default=0)
     content = models.TextField(u"活动详情")
     speaker = models.TextField(u"会议主讲人",blank=True,null=True)
+    the_host = models.CharField(u"主办方",max_length=255,blank=True,null=True)
+    to_undertake = models.CharField(u"承办方",max_length=255,blank=True,null=True)
+    type = models.SmallIntegerField(u"活动类型",default=0)
 
     status = models.SmallIntegerField(u"状态",default=1)
     cid = models.IntegerField(u"创建人id",default=0)
@@ -268,6 +292,7 @@ class Collection(models.Model):
 
 class Signup(models.Model):
     """报名信息
+    signup_status:0/待上传凭证,1/待审核,2/待选酒店,3/待核销,4/已核销,-1/已驳回
     """
     user_id = models.IntegerField(u"期刊id",default=0)
     conference_id = models.IntegerField(u"会议id",default=0)
@@ -283,8 +308,22 @@ class Signup(models.Model):
     phone = models.CharField(u"职称",max_length=11,null=True)
     email = models.CharField(u"职称",max_length=11,null=True)
     signup_status = models.SmallIntegerField(u"状态",default=0)
-    hotel_id = models.IntegerField(u"会议id",blank=True)
-    room_id = models.IntegerField(u"会议id",blank=True)
+    hotel_id = models.IntegerField(u"会议id",blank=True,null=True)
+    room_id = models.IntegerField(u"会议id",blank=True,null=True)
+    room_nums = models.IntegerField(u"入驻人数",null=True)
+    room_stime = models.CharField(u"入驻开始时间",max_length=50,null=True)
+    room_etime = models.CharField(u"入驻结束时间",max_length=50,null=True)
+    proof_img = models.TextField(u"入驻凭证",null=True,blank=True)
+    paytype = models.SmallIntegerField(u"状态",default=0,null=True,blank=True)
+    billtype = models.SmallIntegerField(u"状态",default=0,null=True,blank=True)
+    billhead = models.CharField(u"发票抬头",max_length=255,null=True,blank=True)
+    billno = models.CharField(u"纳税人识别码",max_length=255,null=True,blank=True)
+    billaddress = models.CharField(u"注册地址",max_length=255,null=True,blank=True)
+    billphone = models.CharField(u"注册电话",max_length=255,null=True,blank=True)
+    billbank = models.CharField(u"开户行",max_length=255,null=True,blank=True)
+    billbankno = models.CharField(u"银行账号",max_length=255,null=True,blank=True)
+    reject_reason = models.TextField(u"驳回原因",null=True,blank=True)
+    verify_qrcode = models.TextField(u"核销二维码",null=True,blank=True)
 
     status = models.SmallIntegerField(u"状态",default=1)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
@@ -302,15 +341,16 @@ class Hotel(models.Model):
     name = models.CharField(u"期刊名称",max_length=50)
     address = models.CharField(u"地址",max_length=255)
     telephone = models.CharField(u"联系电话",max_length=50)
-    longitude = models.CharField(u"联系电话",max_length=50)
-    latitude = models.CharField(u"联系电话",max_length=50)
+    longitude = models.CharField(u"经度",max_length=50)
+    latitude = models.CharField(u"纬度",max_length=50)
+    img = models.TextField(u"酒店图片",blank=True,null=True)
     imgs = models.TextField(u"酒店图片",blank=True,null=True)
 
     status = models.SmallIntegerField(u"状态",default=1)
     cid = models.IntegerField(u"创建人id")
     cname = models.CharField(u"创建人",max_length=50)
-    upid = models.IntegerField(u"创建人id")
-    upname = models.CharField(u"修改人",max_length=50)
+    upid = models.IntegerField(u"创建人id",blank=True,null=True)
+    upname = models.CharField(u"修改人",max_length=50,blank=True,null=True)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
     uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
 
@@ -338,7 +378,7 @@ class Room(models.Model):
     hotel_id = models.IntegerField(u"酒店id")
     layout_id = models.CharField(u"房型id",max_length=255)
     name = models.CharField(u"名称",max_length=50)
-    room_type = models.SmallIntegerField(u"状态",default=1)
+    room_type = models.CharField(u"状态",max_length=200)
     enable_number = models.IntegerField(u"可住人数",default=1)
     room_number = models.IntegerField(u"客房数量",default=1)
     surplus_number = models.IntegerField(u"剩余客房数量",default=0)
@@ -352,12 +392,6 @@ class Room(models.Model):
 
     order = models.IntegerField(u"排序字段",default=0)
     status = models.SmallIntegerField(u"状态",default=1)
-    cid = models.IntegerField(u"创建人id")
-    cname = models.CharField(u"创建人",max_length=50)
-    upid = models.IntegerField(u"创建人id")
-    upname = models.CharField(u"修改人",max_length=50)
-    ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
-    uptime = models.DateTimeField(u"修改时间", auto_now_add=True)
 
     class Meta:
         db_table = "ted_room"
@@ -541,6 +575,9 @@ class Message(models.Model):
     """消息管理
     """
     name = models.CharField(u"单位名称",max_length=50)
+    desc = models.TextField(u"问卷描述",blank=True,null=True)
+    publisher = models.CharField(u"发布单位",max_length=50)
+    receiver_id = models.TextField(u"接收人")
     receiver_id = models.TextField(u"接收人")
     template_id = models.IntegerField(u"模板id",blank=True,null=True)
     viewer_id = models.TextField(u"已查看人",blank=True,null=True)

+ 0 - 1
src/common/views.py

@@ -19,7 +19,6 @@ class DocView(cv.BaseView):
         """
         """
         modules = list(cm.OperationLogConfig.objects.order_by("order").values())
-        print modules
         apis = []
         for mo in modules:
             docstr = None

+ 1 - 1
src/manage.py

@@ -3,7 +3,7 @@ import os
 import sys
 
 if __name__ == "__main__":
-    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
+    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings_dev")
     try:
         from django.core.management import execute_from_command_line
     except ImportError:

+ 602 - 54
src/manage/controls.py

@@ -1,6 +1,7 @@
 #coding=utf-8
 '''
 '''
+import collections
 import os,re,random
 import json,time,datetime
 import shutil
@@ -19,7 +20,7 @@ from utils.exceltool import ExcelTool
 from utils.jgpush import send_notification_by_registration_ids
 import wzhifuSDK as wxpay
 from utils.exceltool import ExcelTool
-from utils.qrcodetool import gen_general_qrcode_img
+from utils.qrcodetool import gen_general_qrcode_img,gen_cus_qrcode_img
 from django.db.models import Q,Sum,Count
 from PIL import Image
 from PIL import Image,ImageDraw,ImageFont
@@ -66,6 +67,16 @@ def add_model(cls,**kwargs):
         template = cm.Template.objects.filter(id=template_id).first()
         widget = json.loads(template.widget) if template.widget else {}
         kwargs["widget"] = json.dumps(widget)
+    if model_name == "Verifier":
+        conference_id = kwargs.get("conference_id")
+        user_id = kwargs.get("user_id")
+        conference_name = cm.Conference.objects.filter(id=conference_id).first().name
+        user = cm.UserInfo.objects.filter(id=user_id).first()
+        user_name = user.nickname
+        user_avatar = user.avatar
+        kwargs["conference_name"] = conference_name
+        kwargs["user_name"] = user_name
+        kwargs["user_avatar"] = user_avatar
     obj = model.objects.create(**kwargs)
     #生成文件分享图片
     if model_name == "Message":
@@ -74,18 +85,37 @@ def add_model(cls,**kwargs):
         survey_img_file = os.path.join(root,"upload/survey_bg_{}.jpg".format(obj.id))
         img = Image.open(survey_bg)
         survey_name = obj.name
-        for i,lst in enumerate(split_list_by_n(survey_name,10)):
+        publisher = u"发布单位:"+obj.publisher
+        #for i,lst in enumerate(split_list_by_n(survey_name,10)):
+        #for i,lst in enumerate(split_list_by_n(survey_name,6)):
+        for i,lst in enumerate(split_list_by_n(survey_name,9)):
+            num = len(lst)
             name = "".join(lst)
             if name:
-                addText(img,survey_bg,name,survey_img_file,(200,235+(i+1)*80),72)
+                #addText(img,survey_bg,name,survey_img_file,(200,235+(i+1)*80),72)
+                #addText(img,survey_bg,name,survey_img_file,(300,435+(i+1)*80),82)
+                #addText(img,survey_bg,name,survey_img_file,(300+(6-num)/2.0*81,235+(i+1)*90),82)
+                addText(img,survey_bg,name,survey_img_file,(300+(6-num)/2.0*81,200+(i+1)*90),82)
+        #添加发布单位
+        #addText(img,survey_bg,unicode("发布单位","utf-8"),survey_img_file,(400,1380),62)
+        if obj.publisher:
+            for i,lst in enumerate(split_list_by_n(publisher,12)):
+                num = len(lst)
+                name = "".join(lst)
+                if name:
+                    #addText(img,survey_bg,name,survey_img_file,(200,235+(i+1)*80),72)
+                    #addText(img,survey_bg,name,survey_img_file,(300,435+(i+1)*80),82)
+                    #addText(img,survey_bg,name,survey_img_file,(340+(6-num)/2.0*61,1400+(i+1)*82),62)
+                    addText(img,survey_bg,name,survey_img_file,(170,1400+(i+1)*82),62)
         #
         url = os.path.join(settings.HOST,"survey/answer.html?id={}&type={}".format(obj.id,obj.type))
-        print url,99999
         tmp_qrcode = "/tmp/survey_qrcode_{}.png".format(obj.id)
-        gen_general_qrcode_img(url,tmp_qrcode)
+        #gen_general_qrcode_img(url,tmp_qrcode)
+        gen_cus_qrcode_img(url,tmp_qrcode)
         rawimg = Image.open(survey_img_file)
         im = Image.open(tmp_qrcode)
-        rawimg.paste(im,(330,840))
+        #rawimg.paste(im,(250,840))
+        rawimg.paste(im,(250,740))
         rawimg.save(survey_img_file)
         template_qrcode = os.path.join(settings.HOST,"upload/survey_bg_{}.jpg".format(obj.id))
         obj.template_qrcode = template_qrcode
@@ -102,8 +132,18 @@ def update_model(cls,**kwargs):
         #拷贝模板字段
         template_id = kwargs.get("template_id")
         template = cm.Template.objects.filter(id=template_id).first()
-        widget = json.loads(template.widget) if template.widget else {}
-        kwargs["widget"] = json.dumps(widget)
+        if template:
+            widget = json.loads(template.widget) if template.widget else {}
+            kwargs["widget"] = json.dumps(widget)
+    if model_name == "Signup":
+        #if kwargs.get("reject_reason"):
+        if "reject_reason" in kwargs:
+            obj = model.objects.filter(id=id).first()
+            reason = json.loads(obj.reject_reason) if obj.reject_reason else []
+            cid = kwargs.pop("uid")
+            cname = cm.SysUserInfo.objects.filter(id=cid).first().name
+            reason.append({"reason":kwargs.get("reject_reason"),"ctime":ccf.get_now_str(),"cid":cid,"cname":cname})
+            kwargs["reject_reason"] = json.dumps(reason)
     rst = model.objects.filter(id=id).update(**kwargs)
     if model_name == "Message":
         obj = model.objects.filter(id=id).first()
@@ -112,21 +152,38 @@ def update_model(cls,**kwargs):
         survey_img_file = os.path.join(root,"upload/survey_bg_{}.jpg".format(obj.id))
         img = Image.open(survey_bg)
         survey_name = obj.name
-        for i,lst in enumerate(split_list_by_n(survey_name,10)):
+        publisher = u"发布单位:"+obj.publisher
+        #for i,lst in enumerate(split_list_by_n(survey_name,10)):
+        #for i,lst in enumerate(split_list_by_n(survey_name,6)):
+        for i,lst in enumerate(split_list_by_n(survey_name,9)):
+            num = len(lst)
             name = "".join(lst)
             if name:
-                addText(img,survey_bg,name,survey_img_file,(200,235+(i+1)*80),72)
+                #addText(img,survey_bg,name,survey_img_file,(200,235+(i+1)*80),72)
+                #addText(img,survey_bg,name,survey_img_file,(300,435+(i+1)*80),82)
+                #addText(img,survey_bg,name,survey_img_file,(300+(6-num)/2.0*81,235+(i+1)*90),82)
+                addText(img,survey_bg,name,survey_img_file,(300+(6-num)/2.0*81,200+(i+1)*90),82)
+        #添加发布单位
+        #addText(img,survey_bg,unicode("发布单位","utf-8"),survey_img_file,(400,1380),62)
+        if obj.publisher:
+            for i,lst in enumerate(split_list_by_n(publisher,12)):
+                num = len(lst)
+                name = "".join(lst)
+                if name:
+                    #addText(img,survey_bg,name,survey_img_file,(200,235+(i+1)*80),72)
+                    #addText(img,survey_bg,name,survey_img_file,(300,435+(i+1)*80),82)
+                    #addText(img,survey_bg,name,survey_img_file,(340+(6-num)/2.0*61,1400+(i+1)*82),62)
+                    addText(img,survey_bg,name,survey_img_file,(170,1400+(i+1)*82),62)
         #
         url = os.path.join(settings.HOST,"survey/answer.html?id={}&type={}".format(obj.id,obj.type))
-        print url,99999
         tmp_qrcode = "/tmp/survey_qrcode_{}.png".format(obj.id)
-        gen_general_qrcode_img(url,tmp_qrcode)
+        #gen_general_qrcode_img(url,tmp_qrcode)
+        gen_cus_qrcode_img(url,tmp_qrcode)
         rawimg = Image.open(survey_img_file)
         im = Image.open(tmp_qrcode)
-        rawimg.paste(im,(330,840))
+        rawimg.paste(im,(250,840))
         rawimg.save(survey_img_file)
         template_qrcode = os.path.join(settings.HOST,"upload/survey_bg_{}.jpg?t={}".format(obj.id,str(time.time())))
-        print template_qrcode,99999999999999999999
         obj.template_qrcode = template_qrcode
         obj.save()
     return rst
@@ -151,8 +208,10 @@ def delete_model(cls,**kwargs):
     ids = str(kwargs.get("id")).split(",")
 
     rst = model.objects.filter(id__in=ids).delete()
-    #if model_name == "Template":
-    #    cm.Message.objects.filter(template_id__in=ids).delete()
+    if model_name == "Hotel":
+        cm.Hotel.objects.filter(id__in=ids).delete()
+        cm.Room.objects.filter(hotel_id__in=ids).delete()
+        cm.ConferenceHotel.objects.filter(hotel_id__in=ids).delete()
     return ids
 
 def delete_model_actual(cls,**kwargs):
@@ -187,7 +246,6 @@ def get_detail_info(cls,**kwargs):
                 if csrobj:
                     result = json.loads(csrobj.result) if csrobj.result else {}
                     if result:
-                        print widget,9999
                         for w in widget:
                             w["result"] = result.get(w["label"])
                             w[w["label"]] = result.get(w["label"])
@@ -201,8 +259,34 @@ def get_detail_info(cls,**kwargs):
             new_viewer_ids = filter(lambda x:x["id"]!=kwargs.get("cid"),viewer_ids)
             new_viewer_ids.append({"id":kwargs.get("cid"),"time":ccf.get_now_str()})
             model.objects.filter(id=id).update(viewer_id=json.dumps(new_viewer_ids))
+    if model_name == "Conference":
+        rst["signup_fields"] = json.loads(rst["signup_fields"] if rst["signup_fields"] else [])
+        rst["speaker"] = json.loads(rst["speaker"] if rst["speaker"] else [])
+    if model_name == "Activity":
+        rst["speaker"] = json.loads(rst["speaker"] if rst["speaker"] else [])
+    if model_name == "Hotel":
+        rst["imgs"] = json.loads(rst["imgs"]) if rst["imgs"] else []
+        #print rst,9999
+        rooms = list(cm.Room.objects.filter(hotel_id=rst["id"]).values())
+        for r in rooms:
+            r["imgs"] = json.loads(r["imgs"]) if r["imgs"] else []
+        rst["rooms"] = rooms
+    if model_name == "Journal":
+        rst["organizer_id"] = cm.JournalOrganizer.objects.filter(journal_id=rst["id"]).first().organizer_id
     return rst
 
+def get_search_list(cls,**kwargs):
+    """
+    """
+    model_name = re.search(r'.*\.(\w+)SearchView',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("id","name"))
+    return data
+
+
 def get_list_info(cls,**kwargs):
     """
     """
@@ -214,18 +298,25 @@ def get_list_info(cls,**kwargs):
             qset = qset.filter(type=kwargs.get("type"))
         qset = qset.order_by("-id")
     else:
-        qset = qset.filter(status=1).order_by("-id")
+        qset = qset.order_by("-id")
     if kwargs.get("name"):
         qset = qset.filter(name__icontains=kwargs.get("name"))
     if model_name == "SysUserInfo":
         if kwargs.get("journal_id"):
             qset = qset.filter(journal_id=kwargs.get("journal_id"))
+    if model_name == "Signup":
+        if kwargs.get("conference_id"):
+            qset = qset.filter(conference_id=kwargs.get("conference_id"))
+        if kwargs.get("hotel_id"):
+            qset = qset.filter(hotel_id=kwargs.get("hotel_id"))
+        if kwargs.get("order_status"):
+            qset = qset.filter(signup_status=kwargs.get("order_status"))
+    if model_name == "Activity":
+        qset = qset.filter(type=kwargs.get("type"))
     #数据权限处理
     if model_name in ["Notice","Message"]:
         cid = kwargs.get("cid")
-        print cid,4444444444444444
         user = cm.SysUserInfo.objects.filter(id=cid).first()
-        print user.role_id
         if user.role_id == 2: 
             if model_name == "Notice":
                 qset = qset.filter(receiver_id__icontains=",{}]".format(cid))
@@ -285,6 +376,23 @@ def get_list_info(cls,**kwargs):
             #    d["edit"] = 1
             d["edit"] = 1
 
+    if model_name == "Verifier":
+        for d in data:
+            conference_id = d["conference_id"]
+            user_id = d["user_id"]
+            d["conference_name"] = cm.Conference.objects.filter(id=conference_id).first().name
+            d["avatar"] = cm.UserInfo.objects.filter(id=user_id).first().name
+
+    if model_name == "Article":
+        for d in data:
+            d["journal_name"] = cm.Journal.objects.filter(id=d["journal_id"]).first().name
+    if model_name == "Activity":
+        for d in data:
+            d["journal_name"] = cm.Journal.objects.filter(id=d["journal_id"]).first().name
+    if model_name == "Organizer":
+        for d in data:
+            d["journal_num"] = cm.Journal.objects.filter(organizer_id=d["id"]).count()
+
     page = int(kwargs.get("page",0))
     page_size = int(kwargs.get("page_size",20))
     if page and page_size:
@@ -478,7 +586,6 @@ def send_messages(request):
     vals["sender_user_type"] = utype
     vals["message_type"] = "notice"
     vals["receiver_utype"] = 3
-    print vals,999999999999999999
     if vals.get("send_type") == 1:
         entset = cm.EnterPrise.objects.all()
         if vals.get("area"):
@@ -494,7 +601,6 @@ def send_messages(request):
         enterprise_ids = str(vals.get("receiver_ids")).split(",")
         receiver_ids = list(cm.StaffUser.objects.filter(enterprise_id__in=enterprise_ids).values_list("id",flat=True))
         receiver_ids = ",".join([str(x) for x in receiver_ids])
-        print receiver_ids,99999999999999999999
         vals["enterprise_ids"] = ",".join([str(x) for x in enterprise_ids])
         vals["receiver_ids"] = receiver_ids
 
@@ -760,11 +866,9 @@ def get_dashboard_index(**vals):
         fxlevels = [u"重大风险",u"较大风险",u"一般风险",u"低风险"]
         for fx in fxlevels:
             mtset = cm.MonitTask.objects.all()
-            print fx
             tmp = {}
             tmp["name"] = fx
             mtcount = mtset.values("enterprise_id").annotate(count=Count("enterprise_id"))
-            print mtcount,555555555555555
             data = []
             for mtc in mtcount:
                 enterprise_id = mtc["enterprise_id"]
@@ -784,7 +888,6 @@ def get_dashboard_index(**vals):
         #    {"name":u"低风险","data":[{"enterprise_name":u"测试企业","value":100},{"enterprise_name":u"测试企业2","value":80}]} 
         #]
 
-        print enterprise_fx_data,99999999999999999999
         ret["enterprise_fx_data"] = enterprise_fx_data[:5]
         #企业隐患统计
         enterprise_yh_data = []
@@ -865,7 +968,6 @@ def get_dashboard_index(**vals):
         riskpoint_count_data = []
         spset = cm.MonitTask.objects.filter(enterprise_id=uid)
         spcount = spset.values("riskpoint_item0").annotate(count=Count("riskpoint_item0"))
-        print spcount,66666666666666666
         for spc in spcount:
             riskpoint_count_data.append({"name":spc["riskpoint_item0"],"value":spc["count"]})
         ret["riskpoint_count_data"] = [
@@ -875,7 +977,6 @@ def get_dashboard_index(**vals):
         ret["riskpoint_count_data"] = riskpoint_count_data
         #时间任务统计
         dates = ccf.get_month_dates()
-        print dates
         time_count = []
         for date in dates:
             st = "{}-{}-{} 00:00:00".format(date[0:4],date[4:6],date[6:8])
@@ -941,7 +1042,6 @@ def delete_goods(request):
     """
     qdata = request.json
     _id = qdata.get("id")
-    print _id,999999999999
     cm.Goods.objects.filter(id=_id).update(status=0)
 
 def get_user_journals_list(request):
@@ -1041,15 +1141,11 @@ def recurse_del(list_data):
             continue
         
         if not list_data[index].get("children"):
-            print "[Deleted] ", list_data[index]
             del list_data[index]
         else:
-            print "[Recurved] ", list_data[index].get("children")
             recurse_del(list_data[index].get("children"))
 
             if not list_data[index].get("children"):
-                print "[Deleted] ", list_data[index]
-                print 1111111111
                 del list_data[index]
             else:
                 index = index + 1
@@ -1166,11 +1262,20 @@ def get_survey_analyse_list_out(**kwargs):
     _type = kwargs.get("type")
 
     message = cm.Message.objects.filter(id=message_id).first()
-    #template_id = message.template_id 
-    #template = cm.Template.objects.filter(id=template_id).first()
-    #widgets = json.loads(template.widget) if template.widget else []
     widgets = json.loads(message.widget) if message.widget else []
-    headers = [x["label"] for x in widgets]
+    #新增域组件后处理
+    new_widgets = []
+    for wdg in widgets:
+        if not wdg["type"] == "group": 
+            new_widgets.append(wdg)
+        else:
+            for cwdg in wdg["children"]:
+                cwdg["label"] = cwdg["label"] + "("+wdg["label"]+")"
+                new_widgets.append(cwdg)
+    #headers = [x["label"] for x in widgets]
+    #headers = [x["label"] for x in new_widgets]
+    headers = [{"label":x["label"],"type":x["type"]} for x in new_widgets]
+
     msrset = cm.MessageSurveyResult.objects.filter(message_id=message_id)
     if kwargs.get("name"):
         msrset = msrset.filter(result__icontains=kwargs.get("name"))
@@ -1179,7 +1284,8 @@ def get_survey_analyse_list_out(**kwargs):
     for item in msrdata:
         row = {}
         rst = json.loads(item["result"]) 
-        for label in headers:
+        for h in headers:
+            label = h["label"]
             #row["label"] = headers
             #row[label] = label
             row["post_time"] = item["ctime"]
@@ -1201,9 +1307,17 @@ def get_survey_question_analyse_list(**kwargs):
     message_id = kwargs.get("id")
     _type = kwargs.get("type")
     message = cm.Message.objects.filter(id=message_id).first()
-    #template = cm.Template.objects.filter(id=message.template_id).first()
-    #widgets = json.loads(template.widget) if template.widget else []
     widgets = json.loads(message.widget) if message.widget else []
+    #新增域组件后处理
+    new_widgets = []
+    for wdg in widgets:
+        if not wdg["type"] == "group": 
+            new_widgets.append(wdg)
+        else:
+            for cwdg in wdg["children"]:
+                cwdg["label"] = cwdg["label"] + "("+wdg["label"]+")"
+                new_widgets.append(cwdg)
+    widgets = new_widgets
     #填报结果
     results = cm.MessageSurveyResult.objects.filter(message_id=message_id)
     for wd in widgets: 
@@ -1227,7 +1341,7 @@ def get_survey_question_analyse_list(**kwargs):
                         item["total"] += 1
                     if value in rst.get(label):
                         item["times"] += 1
-                    item["sale"] = round(float(item["times"])/item["total"]*100,2)
+                    item["sale"] = round(float(item["times"])/item["total"]*100,2) if item["total"] else 0.0
         if wd["type"] == "radio":
             items = wd["items"]
             for item in items:
@@ -1240,6 +1354,12 @@ def get_survey_question_analyse_list(**kwargs):
                     if value == rst.get(label):
                         item["times"] += 1
                     item["sale"] = round(float(item["times"])/item["total"]*100,2)
+        #图片
+        if wd["type"] == "image":
+            for item in results:
+                rst = json.loads(item.result) 
+                result.extend(rst.get(label))
+
         wd["result"] = result
     
     return widgets
@@ -1306,10 +1426,18 @@ def download_survey_result_out(request):
     _type = qdata.get("type")
 
     message = cm.Message.objects.filter(id=message_id).first()
-    #template_id = message.template_id 
-    #template = cm.Template.objects.filter(id=template_id).first()
-    #widgets = json.loads(template.widget) if template.widget else []
     widgets = json.loads(message.widget) if message.widget else []
+    #新增域组件后处理
+    new_widgets = []
+    for wdg in widgets:
+        if not wdg["type"] == "group": 
+            new_widgets.append(wdg)
+        else:
+            for cwdg in wdg["children"]:
+                cwdg["label"] = cwdg["label"] + "("+wdg["label"]+")"
+                new_widgets.append(cwdg)
+    widgets = new_widgets
+
     headers = [x["label"] for x in widgets]
     msrset = cm.MessageSurveyResult.objects.filter(message_id=message_id)
     msrdata = list(msrset.values())
@@ -1318,7 +1446,11 @@ def download_survey_result_out(request):
         row = []
         rst = json.loads(item["result"]) 
         for label in headers:
-            row.append(rst.get(label))
+            #row.append(rst.get(label))
+            ans = rst.get(label)
+            if isinstance(ans,type([])):
+                ans = ",".join(ans)
+            row.append(ans)
         row.append(ccf.datetime_to_str(item["ctime"]))
         data.append(row)
     exceltool = ExcelTool("/tmp/demo.xls")
@@ -1340,10 +1472,17 @@ def download_survey_result_all(request):
     _type = qdata.get("type")
 
     message = cm.Message.objects.filter(id=message_id).first()
-    #template_id = message.template_id 
-    #template = cm.Template.objects.filter(id=template_id).first()
-    #widgets = json.loads(template.widget) if template.widget else []
     widgets = json.loads(message.widget) if message.widget else []
+    #新增域组件后处理
+    new_widgets = []
+    for wdg in widgets:
+        if not wdg["type"] == "group": 
+            new_widgets.append(wdg)
+        else:
+            for cwdg in wdg["children"]:
+                cwdg["label"] = cwdg["label"] + "("+wdg["label"]+")"
+                new_widgets.append(cwdg)
+    widgets = new_widgets
     headers = [x["label"] for x in widgets]
     msrset = cm.MessageSurveyResult.objects.filter(message_id=message_id)
     msrdata = list(msrset.values())
@@ -1357,7 +1496,11 @@ def download_survey_result_all(request):
             row = [realname,journal_name]
             rst = json.loads(item["result"]) 
             for label in headers:
-                row.append(rst.get(label))
+                #row.append(rst.get(label))
+                ans = rst.get(label)
+                if isinstance(ans,type([])):
+                    ans = ",".join(ans)
+                row.append(ans)
             row.append(ccf.datetime_to_str(item["ctime"]))
             data.append(row)
         headers = [u"管理员姓名",u"所属期刊"]+headers
@@ -1366,7 +1509,11 @@ def download_survey_result_all(request):
             row = []
             rst = json.loads(item["result"]) 
             for label in headers:
-                row.append(rst.get(label))
+                #row.append(rst.get(label))
+                ans = rst.get(label)
+                if isinstance(ans,type([])):
+                    ans = ",".join(ans)
+                row.append(ans)
             row.append(ccf.datetime_to_str(item["ctime"]))
             data.append(row)
     exceltool = ExcelTool("/tmp/demo.xls")
@@ -1389,10 +1536,17 @@ def download_survey_result_item(request):
     item = qdata.get("item")
 
     message = cm.Message.objects.filter(id=message_id).first()
-    #template_id = message.template_id 
-    #template = cm.Template.objects.filter(id=template_id).first()
-    #widgets = json.loads(template.widget) if template.widget else []
     widgets = json.loads(message.widget) if message.widget else []
+    #新增域组件后处理
+    new_widgets = []
+    for wdg in widgets:
+        if not wdg["type"] == "group": 
+            new_widgets.append(wdg)
+        else:
+            for cwdg in wdg["children"]:
+                cwdg["label"] = cwdg["label"] + "("+wdg["label"]+")"
+                new_widgets.append(cwdg)
+    widgets = new_widgets
     if item:
         widgets = filter(lambda x:x["label"]==item,widgets)
     headers = [x["label"] for x in widgets]
@@ -1408,7 +1562,11 @@ def download_survey_result_item(request):
             row = [realname,journal_name]
             rst = json.loads(item["result"]) 
             for label in headers:
-                row.append(rst.get(label))
+                #row.append(rst.get(label))
+                ans = rst.get(label)
+                if isinstance(ans,type([])):
+                    ans = ",".join(ans)
+                row.append(ans)
             row.append(ccf.datetime_to_str(item["ctime"]))
             data.append(row)
         headers = [u"管理员姓名",u"所属期刊"]+headers
@@ -1417,7 +1575,10 @@ def download_survey_result_item(request):
             row = []
             rst = json.loads(item["result"]) 
             for label in headers:
-                row.append(rst.get(label))
+                ans = rst.get(label)
+                if isinstance(ans,type([])):
+                    ans = ",".join(ans)
+                row.append(ans)
             row.append(ccf.datetime_to_str(item["ctime"]))
             data.append(row)
     exceltool = ExcelTool("/tmp/demo.xls")
@@ -1426,6 +1587,75 @@ def download_survey_result_item(request):
     return xlsdata
 
 
+def show_survey_result_item(request):
+    """
+    """
+    qdata = request.json
+    need_params = ["message_id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+
+    message_id = qdata.get("message_id")
+    _type = qdata.get("type")
+    item = qdata.get("item")
+    curitem = qdata.get("item")
+    name = qdata.get("name")
+
+    message = cm.Message.objects.filter(id=message_id).first()
+    widgets = json.loads(message.widget) if message.widget else []
+    #新增域组件后处理
+    new_widgets = []
+    for wdg in widgets:
+        if not wdg["type"] == "group": 
+            new_widgets.append(wdg)
+        else:
+            for cwdg in wdg["children"]:
+                cwdg["label"] = cwdg["label"] + "("+wdg["label"]+")"
+                new_widgets.append(cwdg)
+    widgets = new_widgets
+    if item:
+        widgets = filter(lambda x:x["label"]==item,widgets)
+    headers = [x["label"] for x in widgets]
+    #headers = [{"type":x["type"],"label":x["label"]} for x in widgets]
+    msrset = cm.MessageSurveyResult.objects.filter(message_id=message_id)
+    msrdata = list(msrset.values())
+    data = []
+    if int(_type) == 0:
+        for item in msrdata:
+            cid = item["cid"]
+            cuser = cm.SysUserInfo.objects.filter(id=cid).first()
+            realname = cuser.realname
+            journal_name = cm.Journal.objects.filter(id=cuser.journal_id).first().name
+            row = collections.OrderedDict()
+            #row.update({"realname":realname,"journal_name":journal_name,"ctime":ccf.datetime_to_str(item["ctime"])})
+            row[u"姓名"]=realname
+            row[u"所属期刊"]=journal_name
+            rst = json.loads(item["result"]) 
+            for label in headers:
+                #row.append({label:rst.get(label)})
+                #row.update({label:rst.get(label)})
+                row[label] = rst.get(label)
+            row["填报时间"]=ccf.datetime_to_str(item["ctime"])
+            #row.append(ccf.datetime_to_str(item["ctime"]))
+            data.append(row)
+        headers = [u"管理员姓名",u"所属期刊"]+headers
+    else:
+        for item in msrdata:
+            row = collections.OrderedDict()
+            #row.update({"ctime":ccf.datetime_to_str(item["ctime"])})
+            rst = json.loads(item["result"]) 
+            print headers
+            for label in headers:
+                row[label] = rst.get(label)
+            #row.append(ccf.datetime_to_str(item["ctime"]))
+            row["填报时间"]=ccf.datetime_to_str(item["ctime"])
+            data.append(row)
+    if name:
+        data = filter(lambda x:name in x[curitem],data)
+    return data
+
+
 def get_notice_analyse(**kwargs):
     """获取内部消息分析统计
     """
@@ -1527,3 +1757,321 @@ def get_message_out_info(**kwargs):
         #rst["widget"] = json.loads(tpl["widget"]) if tpl else []
         rst["widget"] = json.loads(rst["widget"]) if rst["widget"] else []
     return rst
+
+
+def add_hotel(**kwargs):
+    """添加酒店
+    """
+    if "id" in kwargs:
+        kwargs.pop("id")
+    kwargs["imgs"] = json.dumps(kwargs["imgs"])
+    rooms = kwargs.pop("rooms")
+    hobj = cm.Hotel.objects.create(**kwargs)
+    for room in rooms:
+        if "id" in room:
+            room.pop("id")
+        room["imgs"] = json.dumps(room["imgs"])
+        room["hotel_id"] = hobj.id
+        cm.Room.objects.create(**room)
+    return hobj.id
+
+def update_hotel(**kwargs):
+    """修改酒店
+    """
+    id = kwargs.pop("id")
+    rooms = kwargs.pop("rooms")
+    cm.Hotel.objects.filter(id=id).update(**kwargs)
+    for room in rooms:
+        room["hotel_id"] = id
+        room["imgs"] = json.dumps(room["imgs"])
+        if "id" in room:
+            rid = room.pop("id")
+            cm.Room.objects.filter(id=rid).update(**room)
+        else:
+            cm.Room.objects.create(**room)
+
+def delete_hotel(**kwargs):
+    """删除酒店
+    """
+
+
+def add_conference_hotel(**kwargs):
+    """为会议添加酒店
+    """
+    conference_id = kwargs.pop("conference_id")
+    hid = add_hotel(**kwargs)
+    obj = cm.ConferenceHotel.objects.create(
+        conference_id=conference_id,hotel_id=hid)
+    obj.order = obj.id
+    obj.save()
+
+
+def get_conference_hotels(**kwargs):
+    """获取会议酒店信息
+    """
+    conference_id = kwargs.pop("conference_id")
+    hotel_ids = cm.ConferenceHotel.objects.filter(conference_id=conference_id)\
+        .order_by("-order").values_list("hotel_id",flat=True)
+    hotels = []
+    for hid in hotel_ids:
+        ht = cm.Hotel.objects.filter(id=hid).values().first()
+        ht["imgs"] = json.loads(ht["imgs"]) if ht["imgs"] else []
+        rooms = list(cm.Room.objects.filter(hotel_id=ht["id"]).values())
+        for r in rooms:
+            r["imgs"] = json.loads(r["imgs"]) if r["imgs"] else []
+        ht["rooms"] = rooms
+        hotels.append(ht)
+    return hotels
+
+
+def delete_conference_hotel(**kwargs):
+    """删除会议酒店
+    """
+    conference_id = kwargs.pop("conference_id")
+    hotel_id = kwargs.pop("hotel_id")
+    cm.ConferenceHotel.objects.filter(
+        conference_id=conference_id,hotel_id=hotel_id).delete()
+    if cm.Signup.objects.filter(hotel_id=hotel_id).exists():
+        raise ce.TipException(u"该酒店已经有人预定不能删除!")
+    cm.Hotel.objects.filter(id=hotel_id).delete()
+    cm.Room.objects.filter(hotel_id=hotel_id).delete()
+
+
+def rank_conference_hotels(**kwargs):
+    """会议酒店信息排序
+    """
+    conference_id = kwargs.pop("conference_id")
+    hotel_id = kwargs.pop("hotel_id")
+    rank = kwargs.pop("rank")
+    chset = cm.ConferenceHotel.objects.all().order_by("order")
+    src_rank_list = list(chset.values_list("order",flat=True))
+    src_rank_list.sort()
+    cur_obj = cm.ConferenceHotel.objects.filter(conference_id=conference_id,
+        hotel_id=hotel_id).first()
+    cur_rank = cur_obj.order
+    cur_index = src_rank_list.index(cur_rank)
+    if rank == "down" and cur_index == 0:
+        raise ce.TipException(u"已经在最后面无法下移!")
+    if rank == "up" and cur_index == len(src_rank_list)-1:
+        raise ce.TipException(u"已经在最前面无法上移!")
+    if rank == "down":
+        cur_obj.order = chset[cur_index-1].order
+        chset.filter(order=chset[cur_index-1].order).update(order=cur_rank)
+        cur_obj.save()
+    if rank == "up":
+        cur_obj.order = chset[cur_index+1].order
+        chset.filter(order=chset[cur_index].order).update(order=cur_rank)
+        cur_obj.save()
+    
+
+def show_journal_info(**kwargs):    
+    """
+    """
+    id = kwargs.get("id")
+    data = list(cm.Journal.objects.filter(id=id).values())
+    rst = data[0] if data else {}
+    #活动回顾
+    #old_activity = list(cm.Activity.objects.filter(journal_id=id,type=1).values()[:3])
+    old_activity = list(cm.Activity.objects.filter(type=1).values()[:3])
+    #活动预告
+    #new_activity = list(cm.Activity.objects.filter(journal_id=id,type=0).values()[:3])
+    new_activity = list(cm.Activity.objects.filter(type=0).values()[:3])
+    #精品文章
+    #good_article = list(cm.Article.objects.filter(journal_id=id).values()[:3])
+    good_article = list(cm.Article.objects.filter().values()[:3])
+    rst["old_activity"] = old_activity
+    rst["new_activity"] = new_activity
+    rst["good_article"] = good_article
+    return rst
+
+
+def get_index_data(**kwargs):
+    """获取首页数据统计
+    """
+    ret = {}
+    journal_total = cm.Journal.objects.all().count()
+    article_total = cm.Article.objects.all().count()
+    activity_total = cm.Activity.objects.all().count()
+    conference_total = cm.Conference.objects.all().count()
+    signup_total = cm.Signup.objects.all().count()
+    article_readnum = cm.Article.objects.aggregate(total=Sum("read_num")).get("total")
+    article_forwardnum = cm.Article.objects.aggregate(total=Sum("forward_num")).get("total")
+    #学科期刊分布
+    subject_journal = cm.Journal.objects.values("subject_id").annotate(count=Count("subject_id")).order_by("-count")[:10]
+    for sj in subject_journal:
+        sj["name"] = cm.Subject.objects.filter(id=sj["subject_id"]).first().name
+        sj["value"] = sj["count"]
+    #单位期刊分布
+    organizer_journal = cm.Journal.objects.values("organizer_id").annotate(count=Count("organizer_id")).order_by("-count")[:10]
+    for oj in organizer_journal:
+        oj["name"] = cm.Organizer.objects.filter(id=oj["organizer_id"]).first().name
+        oj["value"] = oj["count"]
+    #期刊文章分布
+    journal_article = cm.Article.objects.values("journal_id").annotate(count=Count("journal_id")).order_by("-count")[:10]
+    for ja in journal_article:
+        ja["journal_name"] = cm.Journal.objects.filter(id=ja["journal_id"]).first().name
+        ja["name"] = ja["journal_name"]
+        ja["value"] = ja["count"]
+    #文章发布时间统计
+    sql = "select id,count(id) as count,DATE(publish_time) as publish_time from ted_article GROUP BY DATE(publish_time) ORDER BY publish_time"
+    artset = cm.Article.objects.raw(sql)
+    pubtime_article = []
+    for art in artset:
+        pubtime_article.append({"publish_time":art.publish_time,"count":art.count})
+    #文章阅读量统计top5
+    article_readnum_top5 = cm.Article.objects.order_by("-read_num")[:5].values("name","read_num")
+    #会议主办方统计
+    organizer_conference = cm.Conference.objects.values("organizer_id").annotate(count=Count("organizer_id")).order_by("-count")[:10]
+    for oc in organizer_conference:
+        oc["organizer_name"] = cm.Organizer.objects.filter(id=oc["organizer_id"]).first().name
+    #会议时间统计
+    sql = "select id,count(id) as count,DATE(ctime) as ctime from ted_conference GROUP BY DATE(ctime) ORDER BY ctime"
+    conset = cm.Conference.objects.raw(sql)
+    pubtime_conference = []
+    for con in conset:
+        pubtime_conference.append({"publish_time":con.ctime,"count":con.count})
+    #搜索热词
+    search_hot_word = [
+        {"name":u"物理","value":10},
+        {"name":u"激光","value":2},
+        {"name":u"科技","value":5},
+        {"name":u"研究所","value":6}
+        ]
+    
+
+
+    ret["journal_total"] = journal_total
+    ret["article_total"] = article_total
+    ret["activity_total"] = activity_total
+    ret["conference_total"] = conference_total 
+    ret["signup_total"] = signup_total
+    ret["article_readnum"] = article_readnum
+    ret["article_forwardnum"] = article_forwardnum
+    ret["subject_journal"] = list(subject_journal)
+    ret["organizer_journal"] = list(organizer_journal)
+    ret["journal_article"] = list(journal_article)
+    ret["journal_article_top5"] = list(journal_article[:5])
+    ret["pubtime_article"] = list(pubtime_article)
+    ret["article_readnum_top5"] = list(article_readnum_top5)
+    ret["organizer_conference"] = list(organizer_conference)
+    ret["pubtime_conference"] = list(pubtime_conference)
+    ret["search_hot_word"] = search_hot_word
+
+    return ret
+
+
+def download_journal(request):
+    """
+    """
+    qdata = request.json
+
+    header = [u"期刊id",u"期刊名称",u"中文名称",u"外文名称"]
+    data = []
+    jouset = cm.Journal.objects.all()
+    for js in jouset:
+        data.append([
+            js.journal_id,
+            js.name,
+            js.cname,
+            js.ename
+            ])
+
+    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsdata = exceltool.save_data(u"期刊数据表",header,data)
+    return xlsdata
+
+
+def download_organizer(request):
+    """
+    """
+    qdata = request.json
+
+    header = [u"单位名称",u"单位简介"]
+    data = []
+    qset = cm.Organizer.objects.all()
+    for obj in qset:
+        data.append([
+            obj.name,
+            obj.desc
+            ])
+
+    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsdata = exceltool.save_data(u"主办单位数据表",header,data)
+    return xlsdata
+
+
+def download_subject(request):
+    """
+    """
+    qdata = request.json
+
+    header = [u"学科名称",u"学科简介"]
+    data = []
+    qset = cm.Subject.objects.all()
+    for obj in qset:
+        data.append([
+            obj.name,
+            obj.desc
+            ])
+
+    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsdata = exceltool.save_data(u"学科数据表",header,data)
+    return xlsdata
+
+
+def download_signup(request):
+    """
+    """
+    qdata = request.json
+
+    header = [u"会议名称",u"真实姓名"]
+    data = []
+    qset = cm.Signup.objects.all()
+    for obj in qset:
+        data.append([
+            obj.conference_name,
+            obj.name
+            ])
+
+    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsdata = exceltool.save_data(u"报名数据表",header,data)
+    return xlsdata
+
+
+def download_verifier(request):
+    """
+    """
+    qdata = request.json
+
+    header = [u"核销员昵称",u"所属会议","创建时间"]
+    data = []
+    qset = cm.Verifier.objects.all()
+    for obj in qset:
+        data.append([
+            obj.conference_name,
+            obj.user_name,
+            obj.ctime
+            ])
+
+    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsdata = exceltool.save_data(u"核销员",header,data)
+    return xlsdata
+
+
+def download_hotel(request):
+    """
+    """
+    qdata = request.json
+
+    header = [u"酒店名称",u"创建时间"]
+    data = []
+    qset = cm.Hotel.objects.all()
+    for obj in qset:
+        data.append([
+            obj.name,
+            obj.ctime
+            ])
+
+    exceltool = ExcelTool("/tmp/demo.xls")
+    xlsdata = exceltool.save_data(u"酒店",header,data)
+    return xlsdata

+ 43 - 2
src/manage/urls_backstage.py

@@ -27,8 +27,6 @@ urlpatterns = [
     url(r'^message/receiver/list$', views.MessageReceiverListView.as_view()),
     url(r'^common/city$', views.CityListView.as_view()),
     url(r'^journal/organizer/all$', views.OrganizerAllListView.as_view()),
-    url(r'^conference$', views.ConferenceView.as_view()),
-    url(r'^conference/list$', views.ConferenceListView.as_view()),
     url(r'^message/survey/result$', views.MessageSurveyResultView.as_view()),
     url(r'^message/survey/result/out$', views.MessageSurveyResultOutView.as_view()),
     url(r'^message/survey/analyse$', views.MessageSurveyAnalyseView.as_view()),
@@ -38,9 +36,52 @@ urlpatterns = [
     url(r'^message/survey/result/download/out$', views.MessageSurveyResultDownloadOutView.as_view()),
     url(r'^message/survey/result/download/all$', views.MessageSurveyResultDownloadAllView.as_view()),
     url(r'^message/survey/result/download/item$', views.MessageSurveyResultDownloadItemView.as_view()),
+    url(r'^message/survey/result/show/item$', views.MessageSurveyResultShowItemView.as_view()),
     url(r'^message/notice$', views.NoticeView.as_view()),
     url(r'^message/notice/list$', views.NoticeListView.as_view()),
     url(r'^message/notice/analyse$', views.MessageNoticeAnalyseView.as_view()),
     url(r'^message/notice/analyse/download$', views.MessageNoticeAnalyseDownloadView.as_view()),
+    url(r'^signup$', views.SignupView.as_view()),
+    url(r'^signup/list$', views.SignupListView.as_view()),
+    url(r'^signup/download$', views.SignupDownloadView.as_view()),
+    url(r'^conference$', views.ConferenceView.as_view()),
+    url(r'^conference/list$', views.ConferenceListView.as_view()),
+    url(r'^conference/download$', views.ConferenceDownloadView.as_view()),
+    url(r'^conference/hotel$', views.ConferenceHotelView.as_view()),
+    url(r'^conference/hotel/rank$', views.ConferenceHotelRankView.as_view()),
+    url(r'^hotel$', views.HotelView.as_view()),
+    url(r'^hotel/list$', views.HotelListView.as_view()),
+    url(r'^hotel/download$', views.HotelDownloadView.as_view()),
+    url(r'^verifier/list$', views.VerifierListView.as_view()),
+    url(r'^article$', views.ArticleView.as_view()),
+    url(r'^article/list$', views.ArticleListView.as_view()),
+    url(r'^journal/search$', views.JournalSearchView.as_view()),
+    url(r'^journal/show$', views.JournalShowView.as_view()),
+    url(r'^activity$', views.ActivityView.as_view()),
+    url(r'^activity/list$', views.ActivityListView.as_view()),
+    url(r'^journal$', views.JournalView.as_view()),
+    url(r'^journal/list$', views.JournalListView.as_view()),
+    url(r'^journal/download$', views.JournalDownloadView.as_view()),
+    url(r'^journal/upload$', views.JournalUploadView.as_view()),
+    url(r'^subject/search$', views.SubjectSearchView.as_view()),
+    url(r'^organizer/search$', views.OrganizerSearchView.as_view()),
+    url(r'^organizer$', views.OrganizerView.as_view()),
+    url(r'^organizer/list$', views.OrganizerListView.as_view()),
+    url(r'^organizer/download$', views.OrganizerDownloadView.as_view()),
+    url(r'^subject$', views.SubjectView.as_view()),
+    url(r'^subject/list$', views.SubjectListView.as_view()),
+    url(r'^subject/download$', views.SubjectDownloadView.as_view()),
+    url(r'^userinfo/list$', views.UserInfoListView.as_view()),
+    url(r'^verifier$', views.VerifierView.as_view()),
+    url(r'^verifier/list$', views.VerifierListView.as_view()),
+    url(r'^verifier/download$', views.VerifierDownloadView.as_view()),
+    url(r'^hotword$', views.HotWordView.as_view()),
+    url(r'^hotword/list$', views.HotWordListView.as_view()),
+    url(r'^coldword$', views.ColdWordView.as_view()),
+    url(r'^coldword/list$', views.ColdWordListView.as_view()),
+    url(r'^senword$', views.SenWordView.as_view()),
+    url(r'^senword/list$', views.SenWordListView.as_view()),
+    url(r'^banners$', views.BannersView.as_view()),
+    url(r'^banners/list$', views.BannersListView.as_view()),
 ]
 

Разлика између датотеке није приказан због своје велике величине
+ 1585 - 3
src/manage/views.py


+ 1 - 1
src/settings/__init__.py

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

+ 1 - 1
src/settings/base.py

@@ -24,7 +24,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 SECRET_KEY = '19r&eh*ykwhtyg@zr0zvo(wnr_5y8qg5-1!0=a*!!$!pf3smi6'
 
 # SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
+DEBUG = False
 
 ALLOWED_HOSTS = [
     "*"

+ 5 - 5
src/settings/settings_dev.py

@@ -16,10 +16,10 @@ CACHES = {
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
-        'NAME': 'caos',
-        'USER': 'root',
-        'PASSWORD': 'xjc890*()',
-        'HOST': '127.0.0.1',
+        'NAME': 'tedcaostest',
+        'USER': 'tedcaos',
+        'PASSWORD': 'tedcaos123!@#',
+        'HOST': '172.17.22.226',
         'PORT': '3306',
     }
 }
@@ -59,5 +59,5 @@ LOGGING = {
     },
 }
 
-HOST = "https://test.scxjc.club"
+HOST = "http://39.107.246.59:81"
 PROJECT_NAME = u"期刊小程序"

+ 6 - 23
src/settings/settings_online.py

@@ -16,22 +16,14 @@ CACHES = {
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
-        'NAME': 'xeshop',
-        'USER': 'root',
-        'PASSWORD': 'xjc890*()',
-        'HOST': '127.0.0.1',
+        'NAME': 'tedcaos',
+        'USER': 'tedcaos',
+        'PASSWORD': 'tedcaos123!@#',
+        'HOST': '172.17.22.226',
         '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")
 
@@ -67,14 +59,5 @@ LOGGING = {
     },
 }
 
-
-#channels                                                                          
-CHANNEL_LAYERS = {                                                                 
-    "default": {                                                                   
-        "BACKEND": "asgi_redis.RedisChannelLayer",                                     
-        "CONFIG": {                                                                    
-                    "hosts": [os.environ.get('REDIS_URL', 'redis://localhost:6379')],          
-                },                                                                             
-            "ROUTING": "dashboard.routings.channel_routing",                         
-        },                                                                             
-} 
+HOST = "http://caos.tederen.com"
+PROJECT_NAME = u"期刊小程序"

+ 3 - 0
src/settings_dev/__init__.py

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

+ 126 - 0
src/settings_dev/base.py

@@ -0,0 +1,126 @@
+#coding=utf-8
+"""
+Django settings for cloud_defense project.
+
+Generated by 'django-admin startproject' using Django 1.11.1.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.11/topics/settings/
+
+For the full list of settings and their values, see
+https://docs.djangoproject.com/en/1.11/ref/settings/
+"""
+
+import os
+
+# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
+BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+
+# Quick-start development settings - unsuitable for production
+# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
+
+# SECURITY WARNING: keep the secret key used in production secret!
+SECRET_KEY = '19r&eh*ykwhtyg@zr0zvo(wnr_5y8qg5-1!0=a*!!$!pf3smi6'
+
+# SECURITY WARNING: don't run with debug turned on in production!
+DEBUG = False
+
+ALLOWED_HOSTS = [
+    "*"
+]
+
+
+# Application definition
+
+INSTALLED_APPS = [
+    #'django.contrib.admin',
+    #'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'common',
+    'account',
+    'operation_log',
+    'baianxi',
+    'app',
+    'zkyuan',
+    'manage'
+]
+
+MIDDLEWARE = [
+    'django.middleware.security.SecurityMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    #'django.contrib.auth.middleware.AuthenticationMiddleware',
+    #'django.middleware.cache.CacheMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.csrf.CsrfViewMiddleware',
+    'django.contrib.messages.middleware.MessageMiddleware',
+    'django.middleware.clickjacking.XFrameOptionsMiddleware',
+    'operation_log.OpLogMiddleware.OpLogMiddleware'
+]
+
+ROOT_URLCONF = 'urls'
+
+TEMPLATES = [
+    {
+        'BACKEND': 'django.template.backends.django.DjangoTemplates',
+        'DIRS': [os.path.join(BASE_DIR,"../templates"),],
+        'APP_DIRS': True,
+        'OPTIONS': {
+            'context_processors': [
+                'django.template.context_processors.debug',
+                'django.template.context_processors.request',
+                #'django.contrib.auth.context_processors.auth',
+                'django.contrib.messages.context_processors.messages',
+            ],
+        },
+    },
+]
+
+WSGI_APPLICATION = 'wsgi.application'
+
+# Password validation
+# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
+
+AUTH_PASSWORD_VALIDATORS = [
+    {
+        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
+    },
+    {
+        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
+    },
+]
+
+LANGUAGE_CODE = 'zh-hans'
+
+TIME_ZONE = 'Asia/Shanghai'
+
+USE_I18N = True
+
+USE_L10N = True
+
+USE_TZ = False
+DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
+
+STATIC_URL = '/static/'
+
+STATICFILES_DIRS = (
+    (os.path.join(BASE_DIR, '../static')),
+)
+STATIC_ROOT = '/mnt/zkyuan/static'
+
+# 节点上报超时配置(单位:秒)
+SERVER_REPORT_TIMEOUT = 60 * 10
+
+AUTHENTICATION_BACKENDS = [
+    "account.cauth.AccountManage",
+]
+

+ 63 - 0
src/settings_dev/settings_dev.py

@@ -0,0 +1,63 @@
+# coding=utf-8
+from base import *
+
+# redis配置
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': 'redis://127.0.0.1:6379/0',
+        "OPTIONS": {
+            "CLIENT_CLASS": "django_redis.client.default.DefaultClient",
+        },
+    },
+}
+
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'caos',
+        'USER': 'root',
+        'PASSWORD': 'xjc890*()',
+        'HOST': '127.0.0.1',
+        'PORT': '3306',
+    }
+}
+
+# 验证码字体库位置
+FONT_PATH = os.path.join(BASE_DIR, "../static/font", "consola.ttf")
+
+AUTHENTICATION_BACKENDS = [
+    "account.cauth.AccountManage",
+]
+
+# session 过期设置
+SESSION_COOKIE_AGE = 60 * 30
+SESSION_SAVE_EVERY_REQUEST = True
+SESSION_COOKIE_HTTPONLY = False
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'formatters': {
+        'standard': {
+            'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'
+        }
+    },
+    'handlers': {
+        'console': {
+            'class': 'logging.StreamHandler',
+            'level': 'INFO',
+            'formatter': 'standard'
+        },
+    },
+    'loggers': {
+        '': {
+            'handlers': ['console'],
+            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
+        }
+    },
+}
+
+HOST = "https://test.scxjc.club"
+PROJECT_NAME = u"期刊小程序"

+ 63 - 0
src/settings_dev/settings_online.py

@@ -0,0 +1,63 @@
+# coding=utf-8
+from base import *
+
+# redis配置
+CACHES = {
+    'default': {
+        'BACKEND': 'django_redis.cache.RedisCache',
+        'LOCATION': 'redis://127.0.0.1:6379/0',
+        "OPTIONS": {
+            "CLIENT_CLASS": "django_redis.client.default.DefaultClient",
+        },
+    },
+}
+
+
+DATABASES = {
+    'default': {
+        'ENGINE': 'django.db.backends.mysql',
+        'NAME': 'tedcaos',
+        'USER': 'tedcaos',
+        'PASSWORD': 'tedcaos123!@#',
+        'HOST': '172.17.22.226',
+        'PORT': '3306',
+    }
+}
+
+# 验证码字体库位置
+FONT_PATH = os.path.join(BASE_DIR, "../static/font", "consola.ttf")
+
+AUTHENTICATION_BACKENDS = [
+    "account.cauth.AccountManage",
+]
+
+# session 过期设置
+SESSION_COOKIE_AGE = 60 * 30
+SESSION_SAVE_EVERY_REQUEST = True
+SESSION_COOKIE_HTTPONLY = False
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': False,
+    'formatters': {
+        'standard': {
+            'format': '%(asctime)s [%(name)s:%(lineno)d] [%(module)s:%(funcName)s] [%(levelname)s]- %(message)s'
+        }
+    },
+    'handlers': {
+        'console': {
+            'class': 'logging.StreamHandler',
+            'level': 'INFO',
+            'formatter': 'standard'
+        },
+    },
+    'loggers': {
+        '': {
+            'handlers': ['console'],
+            'level': os.getenv('DJANGO_LOG_LEVEL', 'INFO'),
+        }
+    },
+}
+
+HOST = "http://caos.tederen.com"
+PROJECT_NAME = u"期刊小程序"

+ 7 - 23
src/utils/aliyun_sms.py

@@ -3,11 +3,9 @@
 import json
 from aliyunsdkcore.client import AcsClient
 from aliyunsdkcore.request import CommonRequest
-client = AcsClient('LTAI4G1zQ8nGxJFMaLr55ayG', 'jbFR4mSvDbDVoqhWTM8QwkfbGQAjkd', 'cn-hangzhou')
+client = AcsClient('LTAI4GAVFmmyH7S7nyuDs4R1', 'UcsYR7k8W4k3qqytoWiqagfMi0jWgq', 'cn-hangzhou')
 
-def send_pay_notice(phone,name,orderno,goods,amount,totalfee):
-    """给商家发送支付通知
-    """
+def send_sms(phone,code,templatecode):
     request = CommonRequest()
     request.set_accept_format('json')
     request.set_domain('dysmsapi.aliyuncs.com')
@@ -18,27 +16,13 @@ def send_pay_notice(phone,name,orderno,goods,amount,totalfee):
 
     request.add_query_param('RegionId', "cn-hangzhou")
     request.add_query_param('PhoneNumbers', phone)
-    request.add_query_param('SignName', "真老乡")
-    request.add_query_param('TemplateCode', "SMS_206548530")
-    request.add_query_param('TemplateParam', 
-        json.dumps({
-            "name":name,
-            "orderno":orderno,
-            "goods":goods,
-            "amount":amount,
-            "totalfee":totalfee
-            }))
+    request.add_query_param('SignName', "归藏元企业服务平台")
+    request.add_query_param('TemplateCode', templatecode)
+    request.add_query_param('TemplateParam', json.dumps({"code":code}))
     response = client.do_action(request)
-    print response
     return True,u"success"
 
 
-if __name__ == "__main__":
-    phone = "17760590282"
-    name = "王先生"
-    orderno = "12123213123"
-    goods = "通江木耳"
-    amount = 10
-    totalfee = 10.0
-    send_pay_notice(phone,name,orderno,goods,amount,totalfee)
+
+
 

+ 21 - 1
src/utils/qrcodetool.py

@@ -21,4 +21,24 @@ def gen_general_qrcode(url,imgname=None):
 
     return buf_str
 
-gen_general_qrcode_img("http://www.baidu.com","/tmp/test.png")
+def gen_cus_qrcode_img(url,imgname):
+    """
+    """
+    qr = qrcode.QRCode(
+           version=10,
+           error_correction=qrcode.constants.ERROR_CORRECT_H,
+           box_size=8,
+           border=8)
+    qr.add_data(url)
+    #qr.make(fit=True)
+    img = qr.make_image()
+    img.save(imgname)
+    return imgname
+
+    #img = qrcode.make(url)
+    #img.resize((1000,1000))
+    #with open(imgname, 'wb') as f:
+    #    img.save(f)
+
+#gen_general_qrcode_img("http://www.baidu.com","/tmp/test.png")
+#gen_cus_qrcode_img("http://www.baidu.com","/tmp/test.png")

+ 57 - 0
src/utils/wxmp.py

@@ -0,0 +1,57 @@
+#-*-coding:utf-8-*-
+import requests
+import json
+
+class WXMP(object):
+    def __init__(self,appid=None,secret=None):
+        """
+        """
+        self.appid = appid if appid else "wx84a42c807ed07198"
+        self.secret = secret if secret else "86b9b92b6953a866bf3732a85059e5a6"
+
+    def get_access_token(self):
+        """获取access_token
+        """
+        url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s" \
+            % (self.appid,self.secret)
+        res = requests.get(url)
+        print res.json()
+        if res.status_code == 200:
+            return res.json().get("access_token")
+        return None
+
+
+    def upload_media(self,imgpath):
+        """
+        """
+        access_token = self.get_access_token()
+        url = "https://api.weixin.qq.com/cgi-bin/media/upload?access_token=%s&type=%s" % (access_token,"image")
+        files = {"media":(imgpath,open(imgpath,"rb"),"image/png")}
+        res = requests.post(url,files=files)
+        if res.status_code == 200:
+            return res.json().get("media_id")
+        return None
+
+    def upload_news(self,articles):
+        """
+        """
+        access_token = self.get_access_token()
+        url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=%s" % (access_token)
+        res = requests.post(url,json={"articles":articles})
+        print res.json(),11111111111111
+
+
+
+if __name__ == "__main__":
+    wxmp = WXMP()
+    #wxmp.get_access_token()
+    imgpath = "/tmp/testmedia.png"
+    media_id = wxmp.upload_media(imgpath)
+    articles = [{
+        "thumb_media_id":media_id,     
+        "author":"test",     
+        "title":u"测试",     
+        "content_source_url":"https://test.scxjc.club",     
+        "content":u"测试",     
+    }]
+    wxmp.upload_news(articles)

+ 22 - 0
src/wsgi_dev.py

@@ -0,0 +1,22 @@
+# encoding=utf8
+"""
+WSGI config for cloud_defense project.
+
+It exposes the WSGI callable as a module-level variable named ``application``.
+
+For more information on this file, see
+https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/
+"""
+
+import sys
+reload(sys)
+sys.setdefaultencoding("utf-8")
+
+import os
+
+
+from django.core.wsgi import get_wsgi_application
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings_dev")
+
+application = get_wsgi_application()

BIN
static/survey_bg.jpg


BIN
static/upload/survey_bg_108.jpg


BIN
static/upload/survey_bg_109.jpg


BIN
static/upload/survey_bg_110.jpg


BIN
static/upload/survey_bg_111.jpg


BIN
static/upload/survey_bg_112.jpg


BIN
static/upload/survey_bg_113.jpg


BIN
static/upload/survey_bg_114.jpg


BIN
static/upload/survey_bg_115.jpg


BIN
static/upload/survey_bg_116.jpg


BIN
static/upload/survey_bg_117.jpg


BIN
static/upload/survey_bg_118.jpg


BIN
static/upload/survey_bg_119.jpg


BIN
static/upload/survey_bg_120.jpg


BIN
static/upload/survey_bg_121.jpg


BIN
static/upload/survey_bg_122.jpg


BIN
static/upload/survey_bg_123.jpg


BIN
static/upload/survey_bg_124.jpg


BIN
static/upload/survey_bg_125.jpg


BIN
static/upload/survey_bg_126.jpg


BIN
static/upload/survey_bg_127.jpg


BIN
static/upload/survey_bg_128.jpg


BIN
static/upload/survey_bg_129.jpg


BIN
static/upload/survey_bg_130.jpg


BIN
static/upload/survey_bg_131.jpg


BIN
static/upload/survey_bg_132.jpg


BIN
static/upload/survey_bg_133.jpg


BIN
static/upload/survey_bg_134.jpg


BIN
static/upload/survey_bg_135.jpg


BIN
static/upload/survey_bg_136.jpg


BIN
static/upload/survey_bg_137.jpg


BIN
static/upload/survey_bg_138.jpg


BIN
static/upload/survey_bg_139.jpg


BIN
static/upload/survey_bg_140.jpg


BIN
static/upload/survey_bg_141.jpg


BIN
static/upload/survey_bg_142.jpg


BIN
static/upload/survey_bg_143.jpg


BIN
static/upload/survey_bg_144.jpg


BIN
static/upload/survey_bg_145.jpg


BIN
static/upload/survey_bg_146.jpg


BIN
static/upload/survey_bg_147.jpg


BIN
static/upload/survey_bg_148.jpg


BIN
static/upload/survey_bg_149.jpg


BIN
static/upload/survey_bg_150.jpg


BIN
static/upload/survey_bg_151.jpg


BIN
static/upload/survey_bg_152.jpg


BIN
static/upload/survey_bg_153.jpg


BIN
static/upload/survey_bg_154.jpg


BIN
static/upload/survey_bg_155.jpg


BIN
static/upload/survey_bg_156.jpg


BIN
static/upload/survey_bg_157.jpg


BIN
static/upload/survey_bg_158.jpg


BIN
static/upload/survey_bg_159.jpg


BIN
static/upload/survey_bg_160.jpg


BIN
static/upload/survey_bg_161.jpg


BIN
static/upload/survey_bg_162.jpg


BIN
static/upload/survey_bg_163.jpg


BIN
static/upload/survey_bg_164.jpg


BIN
static/upload/survey_bg_165.jpg


BIN
static/upload/survey_bg_166.jpg


BIN
static/upload/survey_bg_167.jpg


BIN
static/upload/survey_bg_168.jpg


BIN
static/upload/survey_bg_169.jpg


BIN
static/upload/survey_bg_170.jpg


BIN
static/upload/survey_bg_171.jpg


BIN
static/upload/survey_bg_172.jpg


BIN
static/upload/survey_bg_173.jpg


BIN
static/upload/survey_bg_174.jpg


BIN
static/upload/survey_bg_175.jpg


BIN
static/upload/survey_bg_176.jpg


BIN
static/upload/survey_bg_177.jpg


BIN
static/upload/survey_bg_178.jpg


BIN
static/upload/survey_bg_179.jpg


BIN
static/upload/survey_bg_180.jpg


BIN
static/upload/survey_bg_181.jpg


+ 0 - 0
templates/answer.html


Неке датотеке нису приказане због велике количине промена