Gogs 5 年 前
コミット
2229618397
72 ファイル変更2151 行追加1223 行削除
  1. 2 2
      src/account/password_handle.py
  2. 4 4
      src/account/views.py
  3. 0 0
      src/bzyifeng/__init__.py
  4. 0 0
      src/bzyifeng/control_contacts.py
  5. 0 0
      src/bzyifeng/control_notice.py
  6. 0 0
      src/bzyifeng/templates/apidoc.html
  7. 0 0
      src/bzyifeng/urls_backstage.py
  8. 4 3
      src/gzyun/views.py
  9. 0 0
      src/bzyifeng/views_contacts.py
  10. 0 0
      src/bzyifeng/views_notice.py
  11. 145 143
      src/common/models.py
  12. 0 131
      src/enterprise/control_enterprise.py
  13. 0 104
      src/enterprise/control_transaction.py
  14. 0 257
      src/enterprise/control_user.py
  15. 0 14
      src/enterprise/urls_backstage.py
  16. 0 208
      src/enterprise/views.py
  17. 0 350
      src/enterprise/views_backstage.py
  18. 6 1
      src/settings/base.py
  19. 1 1
      src/settings/settings_test.py
  20. 2 2
      src/urls.py
  21. 0 0
      src/weixin/__init__.py
  22. 78 0
      src/weixin/cauth.py
  23. 74 0
      src/weixin/control_auth.py
  24. 97 0
      src/weixin/control_bankcard.py
  25. 81 0
      src/weixin/control_department.py
  26. 0 0
      src/weixin/control_organization.py
  27. 0 0
      src/weixin/control_permission.py
  28. 0 0
      src/weixin/control_role.py
  29. 233 0
      src/weixin/control_user.py
  30. 382 0
      src/weixin/controls.py
  31. 0 0
      src/weixin/lock_account.py
  32. 0 0
      src/weixin/models.py
  33. 3 3
      src/enterprise/password_handle.py
  34. 31 0
      src/weixin/urls_backstage.py
  35. 367 0
      src/weixin/views.py
  36. 299 0
      src/weixin/views_backstage.py
  37. 0 0
      src/weixin/views_permission.py
  38. 342 0
      src/weixin/wzhifuSDK.py
  39. BIN
      static/images/jgjj.png
  40. BIN
      static/images/kcjs.png
  41. BIN
      static/images/lxwm.png
  42. BIN
      static/images/pxjh.png
  43. BIN
      static/images/zxbm.png
  44. BIN
      static/images/zxpx.png
  45. BIN
      static/tes2.png
  46. BIN
      static/test.png
  47. BIN
      static/test3.png
  48. BIN
      static/test4.png
  49. BIN
      static/upload/1588754976timg (4).jpg
  50. BIN
      static/upload/1588821309tmp_1b58081293c0fd2f1eb8da966fcdb090.jpg
  51. BIN
      static/upload/1588821838tmp_56e21ec0e1b6ad9166726142f30b9570.jpg
  52. BIN
      static/upload/1588821899tmp_b07a29631af01002362bd8e745857a8e.jpg
  53. BIN
      static/upload/1588821951tmp_41e1ad93ade9b9e91373da8e0746a87b.jpg
  54. BIN
      static/upload/1588821986tmp_159339d369c6a563c68433dcc29e1667.jpg
  55. BIN
      static/upload/1588822035tmp_24db41bceaa11fa1ca8cc41ad4d0588d.jpg
  56. BIN
      static/upload/1588822097tmp_408e032ea6deb80fd117002653b5d1ce.jpg
  57. BIN
      static/upload/1588822121tmp_6003831d42ca17de6d8709842751b511.jpg
  58. BIN
      static/upload/1588822196tmp_9988f901605db4ce75e26c7bc55b3789.jpg
  59. BIN
      static/upload/1588822240tmp_f99197e54ccb6060aefa60fe18d4b63f.jpg
  60. BIN
      static/upload/1588946415tmp_24a1499d051efeb165144b0de1150d09.jpg
  61. BIN
      static/upload/1588946507tmp_de414acc6be1332ea44feb59efcae4fa.jpg
  62. BIN
      static/upload/1588946598tmp_1321ea47f3f66f5f6e887660e0de95dd.jpg
  63. BIN
      static/upload/1588946724tmp_22bd03b099acd8702c0df2e763991d27.jpg
  64. BIN
      static/upload/1588946758tmp_f2cdcec651a67cc371eeec7dd1af3e77.jpg
  65. BIN
      static/upload/1589022535tmp_7b534b18584060c9fe99fa6d358d21da46745d456b3a8cb9.jpg
  66. BIN
      static/upload/1589022545tmp_74e8880b255ad22542d6318e4a106cbe4fdab949751d0bf3.jpg
  67. BIN
      static/upload/1589022556tmp_8319eacda80011f2f660059af4710e6e1639c0beca6a2684.jpg
  68. BIN
      static/upload/1589022564tmp_6d497eda85e5cbe9e368945e2344d410e26b076a8a505acc.jpg
  69. BIN
      static/upload/1589026588tmp_bba258dd0bbabd1760d676f030e20b09.jpg
  70. BIN
      static/upload/1589071686tmp_9612e9141c31e7797fac7f1ed73ae69a.jpg
  71. BIN
      static/upload/1589071963tmp_63f6bd41f3f63971ce35ec0e3dcb3893.jpg
  72. BIN
      static/upload/testvideo.mp4

+ 2 - 2
src/account/password_handle.py

@@ -18,8 +18,8 @@ def make_password(pwd,isdefault=None):
     """
     @attention: 密码加密
     """
-    if not re.search(r'^.*(?=.{8,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd) and not isdefault:
-        raise ceil.TipException(u"密码不符合符号要求!")
+    #if not re.search(r'^.*(?=.{6,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd) and not isdefault:
+    #    raise ceil.TipException(u"密码不符合符号要求!")
     return hashlib.md5(pwd).hexdigest().upper()
 
 def make_default_password(pwd):

+ 4 - 4
src/account/views.py

@@ -13,7 +13,7 @@ from common.models import UserInfo
 import control_user as cr
 from utils.cloopen_sms import cloopensms
 
-class GetPhoneCodeView(cv.AuthView):
+class GetPhoneCodeView(cv.BaseView):
     def send_resetpwd_code_msg(self,phones,content):
         """重置密码短信验证码
         """
@@ -29,9 +29,9 @@ class GetPhoneCodeView(cv.AuthView):
         uid = request.user.id
         qdata = request.json
         phone = qdata.get("phone","")
-        phone = UserInfo.objects.filter(id=uid).first().phone
-        if not phone:
-            return cv.to_normal_fail(u"参数错误")
+        #phone = UserInfo.objects.filter(id=uid).first().phone
+        #if not phone:
+        #    return cv.to_normal_fail(u"参数错误")
         rcode = "".join(random.sample('1234567890',6))
         valid_time = 60*2
 

src/gzyun/__init__.py → src/bzyifeng/__init__.py


src/gzyun/control_contacts.py → src/bzyifeng/control_contacts.py


src/gzyun/control_notice.py → src/bzyifeng/control_notice.py


src/gzyun/templates/apidoc.html → src/bzyifeng/templates/apidoc.html


src/gzyun/urls_backstage.py → src/bzyifeng/urls_backstage.py


+ 4 - 3
src/gzyun/views.py

@@ -25,9 +25,9 @@ class DocView(cv.BaseView):
             docstr = None
             op_url = mo["op_url"]
             response = mo["op_response"]
-            cls = mo["op_view"].split(".")[-1]
-            mod = import_module(".".join(mo["op_view"].split(".")[:-1]))
             try:
+                cls = mo["op_view"].split(".")[-1]
+                mod = import_module(".".join(mo["op_view"].split(".")[:-1]))
                 cls = getattr(mod,cls)
                 op_action_flag = mo["op_action_flag"]
                 if op_action_flag == "GET":
@@ -48,6 +48,7 @@ class DocView(cv.BaseView):
                                 "request_note":request_note
                                 })
             except Exception as e:
+                continue
                 cv.tracefail()
         isroot = request.GET.get("root",0)
         return render(request,"apidoc.html",{"apis":apis,"isroot":isroot,"project_name":settings.PROJECT_NAME})
@@ -77,6 +78,6 @@ class HookView(cv.BaseView):
     def post(self,request):
         """
         """
-        cmdstr = "cd /home/work/365gcd_wsm_backend/src & git pull & monit restart wsm"
+        cmdstr = "cd /mnt/gzyunweb/pc/gzyun_web & git pull origin master & cnpm run build"
         os.system(cmdstr)
         return cv.to_suc()

src/gzyun/views_contacts.py → src/bzyifeng/views_contacts.py


src/gzyun/views_notice.py → src/bzyifeng/views_notice.py


+ 145 - 143
src/common/models.py

@@ -6,31 +6,128 @@ from django.db import models
 
 
 # ---------------- 用户部分 ------------------
-class Department(models.Model):
+class Subject(models.Model):
     name = models.CharField(u"组织名称",max_length=256,blank=True)
-    pid = models.CharField(u"父节点ID",max_length=16,blank=True)
-    permissions = models.TextField(u"权限",blank=True,null=True)
+    intro = models.TextField(u"科目介绍",max_length=256,blank=True,null=True)
+    price_new = models.FloatField(u"新考费用",max_length=256,blank=True,null=True)
+    price_re = models.FloatField(u"复审费用",max_length=256,blank=True,null=True)
+    price_change = models.FloatField(u"换证费用",max_length=256,blank=True,null=True)
+    pid = models.CharField(u"父节点ID",max_length=16,blank=True,null=True)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
+
+    cid = models.IntegerField(u"创建人ID",blank=True)
+    cperson = models.CharField(u"创建人",max_length=255,blank=True)
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)
+
+    class Meta:
+        db_table = "subject"
+        verbose_name = u"培训科目"
+        app_label = "common"
+
+class Class(models.Model):
+    subject_id = models.IntegerField(u"培训科目",blank=True,null=True)
+    subject_name = models.CharField(u"培训科目",blank=True,null=True,max_length=100)
+    name = models.CharField(u"名称",max_length=256,blank=True)
+    signup_time = models.CharField(u"报名时间",max_length=100,blank=True,null=True)
+    signup_limit = models.IntegerField(u"招生人数",blank=True,null=True)
+    signuped_count = models.IntegerField(u"已报名人数",blank=True,null=True,default=0)
+    class_hour = models.IntegerField(u"学时",blank=True,null=True,default=0)
+    class_status = models.SmallIntegerField(u"班级状态",default=1)
+    price = models.FloatField(u"价格信息",blank=True,null=True)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
+
+    cid = models.IntegerField(u"创建人ID",blank=True)
+    cperson = models.CharField(u"创建人",max_length=255,blank=True)
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)
+    class Meta:
+        db_table = "class"
+        verbose_name = u"培训班"
+        app_label = "common"
+
+
+class SignupOrders(models.Model):
+    user_id = models.IntegerField(u"用户id",blank=True,null=True)
+    name = models.CharField(u"名称",max_length=256,blank=True)
+    sex = models.CharField(u"性别",max_length=256,blank=True)
+    idno = models.CharField(u"身份证号",max_length=256,blank=True)
+    education = models.CharField(u"文化程度",max_length=256,blank=True)
+    phone = models.CharField(u"手机号",max_length=13,blank=True)
+    company = models.CharField(u"公司/单位",max_length=13,blank=True,null=True)
+    class_id = models.IntegerField(u"班级id",blank=True,null=True)
+    subject_id = models.IntegerField(u"培训科目id",blank=True,null=True)
+    subject_item = models.CharField(u"培训科目id",max_length=256,blank=True,null=True)
+    train_type = models.CharField(u"培训类型",max_length=50,blank=True,null=True)
+    receive_card = models.CharField(u"领取方式",max_length=13,blank=True,null=True)
+    area = models.CharField(u"所在地区",max_length=13,blank=True,null=True)
+    address = models.CharField(u"地址",max_length=13,blank=True,null=True)
+    idnoimg_face = models.CharField(u"身份证正面照",max_length=256,blank=True,null=True)
+    idnoimg_back = models.CharField(u"身份证正面照",max_length=256,blank=True,null=True)
+    halfbody_img = models.CharField(u"上半身照",max_length=256,blank=True,null=True)
+    education_img = models.CharField(u"学历证书",max_length=256,blank=True,null=True)
+    remark = models.CharField(u"备注",max_length=256,blank=True,null=True)
+
+    price = models.FloatField(u"价格信息",blank=True,null=True)
+    order_status = models.SmallIntegerField(u"订单状态",default=1)
+    signup_status = models.SmallIntegerField(u"报名状态",default=1)
+    classhour_total = models.IntegerField(u"总学时",blank=True,null=True,default=0)
+    classhour_finish = models.IntegerField(u"已完成学时",blank=True,null=True,default=0)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
+
+    cid = models.IntegerField(u"创建人ID",blank=True)
+    cperson = models.CharField(u"创建人",max_length=255,blank=True)
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)
+    class Meta:
+        db_table = "signup_orders"
+        verbose_name = u"报名信息"
+        app_label = "common"
+
+class Category(models.Model):
+    # 基础属性
+    name = models.CharField(u"名字", max_length=255, blank=True,null=True)
+    icon = models.CharField(u"图标", max_length=255, blank=True,null=True)
+    path = models.CharField(u"路径", max_length=255, blank=True,null=True)
+    order = models.IntegerField(u"排序",default=1)
+    is_show = models.SmallIntegerField(u"是否展示",default=1)
     status = models.SmallIntegerField(u"状态(0删除)",default=1)
 
     cid = models.IntegerField(u"创建人ID",blank=True)
     cperson = models.CharField(u"创建人",max_length=255,blank=True)
     ctime = models.DateTimeField(u"创建时间",auto_now_add=True)
+    class Meta:
+        db_table = "category"
+        verbose_name = u"栏目信息"
+        app_label = "common"
 
+class Article(models.Model):
+    # 基础属性
+    category = models.ForeignKey(Category)
+    title = models.CharField(u"标题", max_length=255, blank=True,null=True)
+    intro = models.TextField(u"简介",blank=True,null=True)
+    content = models.TextField(u"内容",blank=True,null=True)
+    order = models.IntegerField(u"排序",default=1)
+    status = models.SmallIntegerField(u"状态(0删除)",default=1)
+
+    cid = models.IntegerField(u"创建人ID",blank=True)
+    cperson = models.CharField(u"创建人",max_length=255,blank=True)
+    ctime = models.DateTimeField(u"创建时间",auto_now_add=True)
     class Meta:
-        db_table = "department"
-        verbose_name = u"部门"
+        db_table = "article"
+        verbose_name = u"文章信息"
         app_label = "common"
 
 
+
 class UserInfo(models.Model):
     # 基础属性
-    name = models.CharField(u"名字", max_length=255, blank=True)
-    password = models.CharField(u"密码", max_length=255, blank=True)
+    name = models.CharField(u"名字", max_length=255, blank=True,null=True)
+    password = models.CharField(u"密码", max_length=255, blank=True,null=True)
     realname = models.CharField(u"真实名称", max_length=255, blank=True, null=True)
-    email = models.CharField(u"邮箱", max_length=255, blank=True)
-    phone = models.CharField(u"手机号", max_length=64, blank=True)
+    email = models.CharField(u"邮箱", max_length=255, blank=True,null=True)
+    phone = models.CharField(u"手机号", max_length=64, blank=True,null=True)
     remark = models.TextField(u"备注", 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)
+    nickname = models.CharField(u"手机号", max_length=64, blank=True,null=True)
     vcard = models.TextField(u"电子名片", blank=True,null=True)
     utype = models.SmallIntegerField(u"用户类型", blank=True,null=True,default=1)
     status = models.SmallIntegerField(u"状态(0删除)",default=1)
@@ -39,7 +136,7 @@ class UserInfo(models.Model):
     last_login_ip = models.CharField(u"上次登录IP", max_length=128, blank=True,null=True)
     is_active = models.CharField(u"是否激活可用", max_length=4, default="1")
     # 功能权限及数据权限
-    department = models.ForeignKey("Department", verbose_name=u"所属部门", blank=True, null=True)
+    #department = models.ForeignKey("Department", verbose_name=u"所属部门", blank=True, null=True)
 
     cid = models.IntegerField(u"创建人ID",blank=True,null=True)
     cperson = models.CharField(u"创建人", max_length=255, blank=True,null=True)
@@ -60,20 +157,6 @@ class UserInfo(models.Model):
         return False
 
 
-class Permission(models.Model):
-    """权限
-    """
-    name = models.CharField(u"权限名称", max_length=50, blank=True)
-    codename = models.CharField(u"权限代码", max_length=255, blank=True)
-    remark = models.CharField(u"备注", max_length=255, blank=True, null=True, default="")
-    order = models.IntegerField(u"排序字段", default=1, blank=True, null=True)
-    pid = models.CharField(u"父节点ID",max_length=16,blank=True,null=True)
-
-    class Meta:
-        db_table = "permission"
-        app_label = "common"
-
-
 class OperationLogConfig(models.Model):
     """操作日志模板配置
     """
@@ -110,25 +193,6 @@ class OperationLog(models.Model):
         verbose_name = u"操作日志"
 
 
-class EmailNotice(models.Model):
-    """邮件通知
-    """
-    receiver = models.TextField(u"接收人集合", blank=True)
-    receiver_name = models.CharField(u'接收人id', max_length=256, blank=True)
-    subject = models.CharField(u'邮件主题', blank=True, max_length=128)
-    content = models.TextField(u"邮件内容", max_length=32, blank=True)
-    is_suc = models.BooleanField(u"是否成功", default=False)
-    error_msg = models.TextField(u'报错信息', blank=True,null=True)
-    send_type = models.CharField(u"发送方式(手动、自动)", max_length=12, blank=True)
-
-    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
-    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
-    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
-
-    class Meta:
-        db_table = "email_notice"
-        verbose_name = u"邮件发送记录"
-
 class MsgNotice(models.Model):
     """短信通知
     """
@@ -166,110 +230,48 @@ class SysNotice(models.Model):
         verbose_name = u"系统通知"
 
 
-class EnterPrise(models.Model):
-    """企业信息
-    """
-    mark = models.IntegerField(u'评分',null=True,blank=True)
-    entno = models.CharField(u'企业编号', max_length=50)
-    name = models.CharField(u'企业名称', max_length=256)
-    regno = models.CharField(u'注册号', max_length=50)
-    licenceorg = models.CharField(u"发证机关",max_length=255)
-    enttype = models.CharField(u"企业类型",max_length=50)
-    address = models.CharField(u"实际办公地址",max_length=255)
-    legalperson = models.CharField(u"法人",max_length=50)
-    entcontact = models.CharField(u"公司电话,法人电话",max_length=50)
-    industry = models.CharField(u"所属行业",max_length=50)
-    taxtype = models.CharField(u"税务类型",max_length=50)
-    subindustry = models.CharField(u"细分行业",max_length=50,blank=True,null=True)
-    profit = models.IntegerField(u"利润",blank=True,null=True)
-    turnover = models.IntegerField(u"营业额",blank=True,null=True)
-    entscale = models.CharField(u"公司规模",max_length=50,blank=True,null=True)
-    regdate = models.CharField(u"注册时间",max_length=50,blank=True,null=True)
-    busscope = models.TextField(u"公司经营范围",blank=True,null=True)
-    principals = models.TextField(u"主要负责人",blank=True,null=True)
-    finacial = models.CharField(u"财务情况",max_length=50,blank=True,null=True)
-    funding = models.CharField(u"融资情况",max_length=50,blank=True,null=True)
-    legalstate = models.CharField(u"法务情况",max_length=50,blank=True,null=True)
-    remark = models.TextField(u"备注",blank=True,null=True)
-    status = models.SmallIntegerField(u"状态(0删除)",default=1)
-
-    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
-    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
-    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
-
-    class Meta:
-        db_table = "enterprise"
-        verbose_name = u"企业信息"
-
-
-class Product(models.Model):
-    """产品
-    """
-    name = models.CharField(u'产品名称',max_length=128)
-    ptype = models.CharField(u'产品类型',max_length=128)
-    intro = models.TextField(u'产品简介',max_length=128)
-    content = models.TextField(u'产品详情')
-    status = models.SmallIntegerField(u"状态(0删除)",default=1)
-
-    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
-    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
-    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
-
-    class Meta:
-        db_table = "product"
-        verbose_name = u"产品信息"
-
-
-class Transaction(models.Model):
-    """交易
+class ClassRoom(models.Model):
+    """课程
     """
-    enterprise = models.ForeignKey("EnterPrise",verbose_name="企业",related_name="enttrans")
-    product = models.ForeignKey("Product",verbose_name="成交产品",related_name="enttrans_pro")
-    price = models.FloatField(u"价格")
-    service_period = models.CharField(u"服务周期",max_length=100)
-    remark = models.TextField(u"备注",blank=True,null=True)
-    status = models.SmallIntegerField(u"状态(0删除)",default=1)
-
-    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
-    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
-    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
+    CAT_CHO = (
+        (1,u"python教程"), 
+        (2,u"爬虫教程"), 
+        (3,u"Sanic教程")
+    )
+    title = models.CharField(u"标题",max_length=100)  
+    cat = models.SmallIntegerField(u"分类",choices=CAT_CHO,default=1)  
+    img = models.ImageField(u"封面图",max_length=100,default="")  
+    intro = models.CharField(u"课程简介",max_length=255,default="")  
+    content = models.TextField(u"课程详情",default="")  
+    create_date = models.DateTimeField(u"创建时间",auto_now=True)
+    update_date = models.DateTimeField(u"修改时间",auto_now=True)
+
+    def __unicode__(self):
+        return self.title
 
     class Meta:
-        db_table = "transaction"
-        verbose_name = u"企业交易"
-
+        db_table = 'classroom'
+        verbose_name = u'课程管理'
+        verbose_name_plural = u'课程管理'
 
-class BankCard(models.Model):
-    """
+class Lessons(models.Model):
+    """视频
     """
-    user_id = models.IntegerField(u"用户id")
-    name = models.CharField(u'名称',max_length=128)
-    cardno = models.CharField(u'银行账户',max_length=128)
-    status = models.SmallIntegerField(u"状态(0删除)",default=1)
-
-    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
-    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
-    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
-
-    class Meta:
-        db_table = "bankcard"
-        verbose_name = u"银行卡"
-
-
-class CashRecord(models.Model):
-    """
-    """
-    bankcard_id = models.IntegerField(u'银行卡')
-    cardname = models.CharField(u'名称',max_length=128,blank=True,null=True)
-    cardno = models.CharField(u'银行账户',max_length=128,blank=True,null=True)
-    cashtype = models.CharField(u'提现方式',max_length=128)
-    cashamount = models.FloatField(u'提现金额')
-    cash_status = models.SmallIntegerField(u"提现状态(0待处理)",default=0)
-
-    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
-    cperson = models.CharField(u'邮件主题', blank=True, max_length=128,null=True)
-    ctime = models.DateTimeField(u"创建时间(发送时间)", auto_now_add=True)
+    classroom = models.ForeignKey(ClassRoom,related_name="lessons")
+    title = models.CharField(u"标题",max_length=100,default="")  
+    img = models.ImageField(u"封面图",default="")  
+    turl = models.CharField(u"试看地址",default="",max_length=255)  
+    url = models.FileField(u"视频地址",default="")  
+    enc_url = models.TextField(u"视频地址",default="",blank=True,null=True)  
+    charge = models.BooleanField(u"是否收费",default=False)
+    iv = models.CharField(u"iv",default="",max_length=255,blank=True,null=True)  
+
+    create_date = models.DateTimeField(u"创建时间",auto_now=True)
+    update_date = models.DateTimeField(u"修改时间",auto_now=True)
+    def __unicode__(self):
+        return self.title
 
     class Meta:
-        db_table = "cashrecord"
-        verbose_name = u"提现记录"
+        db_table = 'lessons'
+        verbose_name = u'视频管理'
+        verbose_name_plural = u'视频管理'

+ 0 - 131
src/enterprise/control_enterprise.py

@@ -1,131 +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_enterprise(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["name","regno","licenceorg","enttype","address","legalperson",
-        "entcontact","industry","taxtype"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    need_params.extend(["subindustry","profit","turnover","entscale","regdate",
-        "busscope","principals","finacial","funding","legalstate","remark"])
-
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    cvals["cid"] = request.user.id
-    cvals["cperson"] = request.user.realname
-    #生成评分和客户编号待完善
-    if cm.EnterPrise.objects.filter(name=cvals.get("name")).exists():
-        raise ce.TipException(u"该客户已录入!")
-    try:
-        entobj = cm.EnterPrise.objects.create(**cvals)
-    except Exception as e:
-        raise c.TipException(str(e))
-
-
-def update_enterprise(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["id","name","regno","licenceorg","enttype","address","legalperson",
-        "entcontact","industry","taxtype"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    need_params.extend(["subindustry","profit","turnover","entscale","regdate",
-        "busscope","principals","finacial","funding","legalstate","remark"])
-
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    cvals["principals"] = json.dumps(cvals["principals"]) 
-    cvals["cid"] = request.user.id
-    cvals["cperson"] = request.user.realname
-    #生成评分和客户编号待完善
-    if cm.EnterPrise.objects.exclude(id=cvals.get("id")).filter(name=cvals.get("name")).exists():
-        raise ce.TipException(u"该客户已录入!")
-    try:
-        cm.EnterPrise.objects.filter(id=cvals.get("id")).update(**cvals)
-    except Exception as e:
-        raise c.TipException(str(e))
-
-
-def delete_enterprise(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.EnterPrise.objects.filter(id__in=ids).update(status=0)
-
-
-def format_enterprise(*ids):
-    """
-    """
-    eset = cm.EnterPrise.objects.filter(id__in=ids,status=1)
-    if not eset.exists():
-        raise ce.TipException(u"客户不存在!")
-    data = list(eset.values())
-    for item in data:
-        item["principals"] = json.loads(item["principals"])
-    return data
-
-def get_enterprise_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(",")
-    entinfo = format_enterprise(*ids)
-    entinfo = entinfo[0] if entinfo else {}
-
-    return entinfo
-
-
-def get_enterprise_list(request):
-    """
-    """
-    kwargs = request.json
-    eset = cm.EnterPrise.objects.filter(status=1)
-    if "name" in kwargs and kwargs.get("name"):
-        eset = eset.filter(name__icontains=kwargs.get("name"))
-    if "industry" in kwargs and kwargs.get("industry"):
-        eset = eset.filter(industry__icontains=kwargs.get("industry"))
-    if "istrans" in kwargs and kwargs.get("istrans"):
-        if kwargs.get("istrans") == 0:
-            eset = eset.filter(enttrans__set__isnull=True)
-        else:
-            eset = eset.filter(enttrans__set__isnull=False)
-    if "transpro" in kwargs and kwargs.get("transpro"):
-        pass
-    if "licenceorg" in kwargs and kwargs.get("licenceorg"):
-        eset = eset.filter(licenceorg=kwargs.get("licenceorg"))
-    if "enttype" in kwargs and kwargs.get("enttype"):
-        eset = eset.filter(enttype=kwargs.get("enttype"))
-    if "turnover" in kwargs and kwargs.get("turnover"):
-        pass
-    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 - 104
src/enterprise/control_transaction.py

@@ -1,104 +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_transaction(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["enterprise_id","product_id","price","service_period"]
-    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:
-        tansobj = cm.Transaction.objects.create(**cvals)
-    except Exception as e:
-        raise c.TipException(str(e))
-
-
-def update_transaction(request):
-    """
-    """
-    kwargs = request.json
-    need_params = ["id","enterprise_id","product_id","price","service_period"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-
-    cvals = ccf.get_need_params(*need_params,**kwargs)
-    try:
-        cm.Transaction.objects.filter(id=cvals.get("id")).update(**cvals)
-    except Exception as e:
-        raise c.TipException(str(e))
-
-
-def delete_transaction(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.Transaction.objects.filter(id__in=ids).update(status=0)
-
-
-def format_transaction(*ids):
-    """
-    """
-    eset = cm.Transaction.objects.filter(id__in=ids,status=1)
-    if not eset.exists():
-        raise ce.TipException(u"客户不存在!")
-    data = list(eset.values())
-    return data
-
-def get_transaction_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(",")
-    entinfo = format_transaction(*ids)
-    entinfo = entinfo[0] if entinfo else {}
-
-    return entinfo
-
-
-def get_transaction_list(request):
-    """
-    """
-    kwargs = request.json
-    eset = cm.Transaction.objects.filter(status=1)
-    if "enterprise_name" in kwargs and kwargs.get("enterprise_name"):
-        #eset = eset.filter(name__icontains=kwargs.get("name"))
-        pass
-    if "product_id" in kwargs and kwargs.get("product_id"):
-        eset = eset.filter(product_id=kwargs.get("product_id"))
-    if "enterprise_id" in kwargs and kwargs.get("enterprise_id"):
-        eset = eset.filter(product_id=kwargs.get("enterprise_id"))
-    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 - 257
src/enterprise/control_user.py

@@ -1,257 +0,0 @@
-#coding=utf-8
-'''
-'''
-import json
-import datetime
-import logging
-import re
-
-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
-
-
-def get_user_info(ids,needs=None,relations=None):
-    """
-    needs:表单独字段筛选
-    relations:关联表信息筛选
-    """
-    qset = cm.UserInfo.objects.filter(id__in=ids)
-    if needs:
-        users = qset.values(*needs)
-    else:
-        users = qset.values("id","name","realname","unitname","phone","email",
-                            "platform","parent_id","is_active","organization_id",
-                            "role_id","cperson","remark","ctime","unitname","expiry_date")
-    if relations and "contactsinfo" in relations:
-        for user in users:
-            user.update({"contactsinfo":list(cm.Contacts.objects.filter(user_id=user["id"]).values())})
-    if relations and "authinfo" in relations:
-        for user in users:
-            user.update({"authinfo":list(cm.UserAuthInfo.objects.filter(user_id=user["id"]).values())[0]})
-    if relations and "roleinfo" in relations:
-        for user in users:
-            user.update({"roleinfo":list(cm.Role.objects.filter(id=user["role_id"]).values())[0]})
-
-    for user in users:
-        organization_id = user["organization_id"]
-        if user.get("platform") == "portal":
-            organization_name = cm.Organization.objects.filter(id=organization_id).first().name
-        else:
-            organization_name = user.get("unitname")
-        role = cm.Role.objects.filter(id=user["role_id"]).first()
-        user.update({"role_name":role.name})
-        user.update({"organization_name":organization_name})
-
-    if relations and "pcode" in relations:
-        for user in users:
-            organization_id = user["organization_id"]
-            if user.get("platform") == "portal":
-                organization_name = cm.Organization.objects.filter(id=organization_id).first().name
-            else:
-                organization_name = user.get("unitname")
-            role = cm.Role.objects.filter(id=user["role_id"]).first()
-            pcode = list(role.permission.all().values_list("codename",flat=True))
-            user.update({"pcode":pcode})
-            user.update({"role_name":role.name})
-            user.update({"organization_name":organization_name})
-    return list(users)
-
-def add_user(**kwargs):
-    """
-    """
-    need_parms = ["name","role_id","expiry_date","authinfo","realname","phone","email"]
-    mse = ccf.check_params(*need_parms,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    if not kwargs.get("organization_id") and not kwargs.get("unitname"):
-        raise ce.TipException(u"组织机构organization_id和unitname必传一个!")
-    if cm.UserInfo.objects.filter(name=kwargs.get("name")).exists():
-        raise ce.TipException(u"用户名重复!")
-    platform = cm.Role.objects.filter(id=kwargs.get("role_id")).first().platform
-    fvals = {
-        "name":kwargs.get("name"),
-        "realname":kwargs.get("realname"),
-        "phone":kwargs.get("phone"),
-        "email":kwargs.get("email"),
-        "organization_id":kwargs.get("organization_id"),
-        "password":kwargs.get("password"),
-        "role_id":kwargs.get("role_id"),
-        "platform":platform,
-        "expiry_date":kwargs.get("expiry_date"),
-        "parent_id":kwargs.get("pid"),
-    }
-    if not fvals.get("password"):
-        #password = "GCD365wsm123!@#"
-        pwd,password = ph.make_default_password(None)
-        fvals.update({"password":password})
-    else:
-        pwd = fvals.get("password")
-        fvals.update({"password":ph.make_password(fvals.get("password"))})
-    with transaction.atomic():
-        uobj = cm.UserInfo.objects.create(**fvals)
-        #保存联系人
-        contactinfo = kwargs.get("contactinfo",[])
-        for ct in contactinfo:
-            ct.update({"user":uobj})
-            cm.Contacts.objects.create(**ct)
-        #保存用户授权信息
-        authinfo = kwargs.get("authinfo")
-        if authinfo:
-            authinfo.update({"user":uobj})
-            cm.UserAuthInfo.objects.create(**authinfo)
-        return {"name":kwargs.get("name"),"password":pwd}
-    return None
-
-def delete_user(**kwargs):
-    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).delete()
-
-
-def update_user(**kwargs):
-    """
-    """
-    need_params = ["id"]
-    mse = ccf.check_params(*need_params,**kwargs)
-    if mse:
-        raise ce.TipException(mse)
-    if not kwargs.get("organization_id") and not kwargs.get("unitname"):
-        raise ce.TipException(u"组织机构organization_id和unitname必传一个!")
-    uvals = {}
-    if "name" in kwargs:
-        if cm.UserInfo.objects.filter(name=kwargs.get("name"))\
-               .exclude(id=kwargs.get("id")).exists():
-            raise ce.TipException(u"用户名重复!")
-        uvals.update({"name":kwargs.get("name")})
-    id = kwargs.get("id")
-    if "role_id" in kwargs:
-        uvals.update({"role_id":kwargs.get("role_id")})
-    if "organization_id" in kwargs:
-        uvals.update({"organization_id":kwargs.get("organization_id")})
-    if "unitname" in kwargs:
-        uvals.update({"unitname":kwargs.get("unitname")})
-    if "realname" in kwargs:
-        uvals.update({"realname":kwargs.get("realname")})
-    if "phone" in kwargs:
-        uvals.update({"phone":kwargs.get("phone")})
-    if "email" in kwargs:
-        uvals.update({"email":kwargs.get("email")})
-    if "expiry_date" in kwargs:
-        uvals.update({"expiry_date":kwargs.get("expiry_date")})
-    with transaction.atomic():
-        cm.UserInfo.objects.filter(id=id).update(**uvals)
-        uobj = cm.UserInfo.objects.filter(id=id).first()
-        #保存联系人
-        uobj.contacts.all().delete()
-        contactinfo = kwargs.get("contactinfo",[])
-        for ct in contactinfo:
-            ct.update({"user":uobj})
-            cm.Contacts.objects.create(**ct)
-        #保存用户授权信息
-        uobj.user_auth.delete()
-        authinfo = kwargs.get("authinfo")
-        if authinfo:
-            authinfo.update({"user":uobj})
-            cm.UserAuthInfo.objects.create(**authinfo)
-        return uobj.id
-
-
-
-def login_user(request):
-    """
-    """
-    info = request.json
-    login_info = 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 login_info or not password:
-        raise ce.TipException(u"账户或密码不能为空!")
-    #if not idcode:
-    #    raise ce.TipException(u"验证码不能为空!")
-    #if idcode.upper() != captcha.upper():
-    #    raise ce.TipException(u"验证码错误!")
-
-    user = auth.authenticate(request, account=login_info, pwd=password)
-    if user:
-        auth.login(request, user)
-        return user
-    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 = get_user_info([upk])[0].get("phone")
-    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

+ 0 - 14
src/enterprise/urls_backstage.py

@@ -1,14 +0,0 @@
-# coding=utf-8
-'''
-'''
-from django.conf.urls import url
-from enterprise import views
-
-urlpatterns = [
-    # 运营
-    url(r'^info$', views.EnterpriseView.as_view()),
-    url(r'^list$', views.EnterpriseListView.as_view()),
-    url(r'^trans/info$', views.EnterpriseTransView.as_view()),
-    url(r'^trans/list$', views.EnterpriseTransListView.as_view()),
-]
-

+ 0 - 208
src/enterprise/views.py

@@ -1,208 +0,0 @@
-# coding=utf-8
-from __future__ import unicode_literals
-import random
-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.captcha import create_idcode
-from common.models import UserInfo
-import control_enterprise as ce
-import control_transaction as ct
-from utils.cloopen_sms import cloopensms
-
-class EnterpriseView(cv.AuthView):
-    def post(self,request):
-        """#新增客户(企业)
-        @name:"成都归藏元",企业名称
-        @regno:"112121",注册号
-        @licenceorg:"成都工商局",发证机关
-        @enttype:"企业服务",企业类型
-        @address:"办公地址"
-        @legalperson:"肖",法人
-        @entcontact:"15982456282"
-        @industry:"机械"
-        @taxtype:"小规模纳税人"
-        @subindustry:"机械加工"
-        @profit:100,年利润
-        @turnover:200,年营业额
-        @entscale:"100~200",企业规模
-        @regdate:"2020.10.01",注册日期
-        @busscope:"主要经营机械加工...",主要经营范围
-        @principals:[{
-            "name":"肖小肖",
-            "job":"开发",
-            "sex":"男",
-            "phone":"15982456282",
-            "procert":"软件工程师",
-            "college":"成都理工",
-            "birthday":"1990.02.02",
-            "hoby":"钓鱼,爬山"
-            }]
-        @finacial:"专职财务"
-        @funding:"天使轮"
-        @legalstate:"专职法务"
-        """
-        try:
-            rst = ce.add_enterprise(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-    def put(self,request):
-        """#修改客户(企业)
-        @id:1,客户id
-        @name:"成都归藏元",企业名称
-        @regno:"112121",注册号
-        @licenceorg:"成都工商局",发证机关
-        @enttype:"企业服务",企业类型
-        @address:"办公地址"
-        @legalperson:"肖",法人
-        @entcontact:"15982456282"
-        @industry:"机械"
-        @taxtype:"小规模纳税人"
-        @subindustry:"机械加工"
-        @profit:100,年利润
-        @turnover:200,年营业额
-        @entscale:"100~200",企业规模
-        @regdate:"2020.10.01",注册日期
-        @busscope:"主要经营机械加工...",主要经营范围
-        @principals:[{
-            "name":"肖小肖",
-            "job":"开发",
-            "sex":"男",
-            "phone":"15982456282",
-            "procert":"软件工程师",
-            "college":"成都理工",
-            "birthday":"1990.02.02",
-            "hoby":"钓鱼,爬山"
-            }]
-        @finacial:"专职财务"
-        @funding:"天使轮"
-        @legalstate:"专职法务"
-        """
-        try:
-            rst = ce.update_enterprise(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 = ce.delete_enterprise(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-
-    def get(self,request):
-        """#获取客户详情
-        @id:1,"客户id"
-        """
-        try:
-            rst = ce.get_enterprise_info(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc(rst)
-
-
-class EnterpriseListView(cv.AuthView):
-    def get(self,request):
-        """#获取客户列表
-        @name:"成都归藏元",客户名称
-        @industry:"机械",行业
-        @istrans:1/0,是否有交易
-        @transpro:"代理记账",成交产品
-        @licenceorg:"成都高新",发证机关
-        @enttype:"个体户",企业类型
-        @turnover:1/0,年营业额大于2000
-        """
-        try:
-            total,rst = ce.get_enterprise_list(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc({"total":total,"list":rst})
-
-
-class EnterpriseTransView(cv.AuthView):
-    def post(self,request):
-        """#新增交易
-        @enterprise_id:1,客户(企业)id
-        @product_id:1,客户(企业)id
-        @price:1800,价格
-        @service_period:"2020-01-01,2020-08-01",服务周期
-        """
-        try:
-            rst = ct.add_transaction(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-    def put(self,request):
-        """#修改交易
-        @id:1,交易id
-        @enterprise_id:1,客户(企业)id
-        @product_id:1,客户(企业)id
-        @price:1800,价格
-        @service_period:"2020-01-01,2020-08-01",服务周期
-        """
-        try:
-            rst = ct.update_transaction(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 = ct.delete_transaction(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-
-    def get(self,request):
-        """#获取客户详情
-        @id:1,"客户id"
-        """
-        try:
-            rst = ct.get_transaction_info(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc(rst)
-
-
-class EnterpriseTransListView(cv.AuthView):
-    def get(self,request):
-        """#获取客户交易记录
-        @enterprise_id:1,客户id
-        @enterprise_name:"成都归藏元",客户名称
-        @product_id:1,产品
-        """
-        try:
-            total,rst = ct.get_transaction_list(request)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc({"total":total,"list":rst})
-
-

+ 0 - 350
src/enterprise/views_backstage.py

@@ -1,350 +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
-
-
-class InfoView(cv.AuthView):
-    def get(self, request):
-        '''
-        #获取全局账号信息
-        '''
-        user = request.user
-        uid = user.id
-        pcode = []
-        try:
-            users = cu.get_user_info([uid],None,["pcode"])[0]
-            return cv.to_suc(users)
-        except Exception as e:
-            return cv.to_fail(e)
-
-class UserView(cv.BaseView):
-    def get(self, request):
-        """
-        #获取用户详情
-        @id:1,用户id
-        """
-        qdata = request.json
-        try:
-            need_params = ["id"]
-            mse = ccf.check_params(*need_params,**qdata)
-            if mse:
-                raise ce.TipException(mse)
-            id = qdata.get("id")
-            res = cu.get_user_info([id],None,relations=["contctsinfo","authinfo","roleinfo"])
-            res = res[0] if res else []
-            return cv.to_suc(res)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-    def post(self, request):
-        '''
-        #新增用户
-        @name:"test",用户名
-        @password:"test123456",用户密码
-        @expiry_date:"20191203",过期时间
-        @organization_id:"1",组织机构id角色为门户平台用户传
-        @role_id:7,角色id
-        @unitname:"单位名称",运营中心名称
-        @contactinfo:[{"name":"","email":""}],联系人信息
-        @authinfo":{"max_domain_num":10,"authorized":"available,bug,event","label":"试用"}
-        @realname:"姓名"
-        @phone:"129823"
-        @email:"129823@qq.com"
-        '''
-        qdata = request.json
-        try:
-            qdata["pid"] = request.user.id
-            user = cu.add_user(**qdata)
-            return cv.to_suc(user)
-        except Exception as e:
-            import traceback
-            traceback.print_exc()
-            return cv.to_fail(e)
-
-    def put(self, request):
-        """
-        #修改用户信息
-        @id:1,用户id其他参数同新增
-        """
-        qdata = request.json
-        try:
-            data = cu.update_user(**qdata)
-        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(**qdata)
-        except Exception as e:
-            return cv.to_fail(e)
-        return cv.to_suc()
-
-class InfoListView(cv.AuthView):
-    def get(self, request):
-        """
-        #用户列表
-        @name:"用户名"
-        @page:1
-        @page_size:10
-        """
-        user = request.user
-        uid = user.id
-        qdata = request.json
-        page = int(qdata.get("page",0))
-        page_size = int(qdata.get("page_size",0))
-        try:
-            total,res = ccc.get_sub_users(uid,page,page_size,qdata)
-            return cv.to_suc({"total":total,"list":res})
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class RoleListView(cv.AuthView):
-    def get(self, request):
-        """#角色列表
-        @page:1 页面
-        @page_size:10 每页数量,默认10
-        """
-        qdata = request.json
-        print qdata
-        page = qdata.get("page",0)
-        page_size = qdata.get("page_size",10)
-        if page:
-            total,roles = crol.get_role_list(None,page=page,page_size=page_size)
-
-            return cv.to_suc({"total":total,"list":roles})
-        else:
-            roles = crol.get_all_role_list()
-            return cv.to_suc(roles)
-
-
-class RoleInfoView(cv.AuthView):
-    """
-    """
-    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)
-        id = qdata.get("id")
-        try:
-            role = crol.get_role_info(*[id])
-            role = role[0] if role else {}
-            return cv.to_suc(role)
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def post(self,request):
-        """#角色添加
-        @name:"test" 角色名称
-        @desc:"test" 角色描述
-        @permission_addroles:[1,2,3] 可以添加的用户角色
-        @permssions:[1,2,3] 权限ID
-        @platform:"operation" 角色归属
-        """
-        qdata = request.json
-        uname = request.user.name
-        qdata.update({"cperson":uname})
-        try:
-            crol.add_role(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def put(self,request):
-        """#角色修改
-        @id:3 角色id
-        @name:"test" 角色名称
-        @desc:"test" 角色描述
-        @permission_addroles:[1,2,3] 可以添加的用户角色
-        @permssions:[1,2,3] 权限ID
-        @platform:"operation" 角色归属
-        """
-        qdata = request.json
-        try:
-            crol.update_role(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-    def delete(self,request):
-        """
-        #角色删除
-        @id:1,2 角色id批量删除多个id用逗号分隔
-        """
-        qdata = request.json
-        try:
-            crol.delete_role(**qdata)
-            return cv.to_suc()
-        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 OrganizationTreeView(cv.AuthView):
-    def get(self, request):
-        """#获取组织机构树
-        """
-        try:
-            uid = request.user.id
-            otree = co.get_organization_tree(uid)
-            return cv.to_suc(otree)
-        except Exception as e:
-            cv.tracefail()
-            return cv.to_fail(e)
-
-
-class OrganizationSearchView(cv.AuthView):
-    def get(self, request):
-        """#搜索组织机构
-        @name:u"测试单位1"
-        """
-        try:
-            uid = request.user.id
-            print request.json
-            name = request.json.get("name","")
-            otree = co.search_organization(name)
-            return cv.to_suc(otree)
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-class OrganizationInfoView(cv.AuthView):
-    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)
-        id = qdata.get("id")
-        try:
-            oinfo = co.get_organization_info(*[id])[0]
-            return cv.to_suc(oinfo)
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def post(self, request):
-        """#添加组织机构
-        @name:"",组织机构名称
-        @sname:"",组织机构简称称
-        @desc:"",简介 非必传
-        @pid:"",上级组织机构id 非必传
-        """
-        qdata = request.json
-        user = request.user
-        qdata.update({"cperson":user.name,"cid":user.id})
-        try:
-            co.add_organization(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def put(self, request):
-        """#修改组织机构
-        @id:"",组织机构id
-        """
-        qdata = request.json
-        try:
-            co.update_organization(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-    def delete(self, request):
-        """#删除组织机构
-        @id:1,2 组织机构id批量删除多个id用逗号分隔
-        """
-        qdata = request.json
-        try:
-            co.delete_organization(**qdata)
-            return cv.to_suc()
-        except Exception as e:
-            return cv.to_fail(e)
-
-
-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.*"]
-        """

+ 6 - 1
src/settings/base.py

@@ -42,8 +42,9 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'common',
     'account',
-    'gzyun',
     'operation_log',
+    'bzyifeng',
+    'weixin'
 ]
 
 MIDDLEWARE = [
@@ -119,7 +120,11 @@ STATIC_URL = '/static/'
 
 STATICFILES_DIRS = (
     (os.path.join(BASE_DIR, '../static')),
+    ('/mnt/bzyifeng/static'),
 )
+STATIC_ROOT = '/mnt/bzyifeng/static'
+
+print STATICFILES_DIRS,99999999999999
 
 # 节点上报超时配置(单位:秒)
 SERVER_REPORT_TIMEOUT = 60 * 10

+ 1 - 1
src/settings/settings_test.py

@@ -16,7 +16,7 @@ CACHES = {
 DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
-        'NAME': 'gzyun',
+        'NAME': 'bzyifeng',
         'USER': 'root',
         'PASSWORD': 'xjc890*()',
         'HOST': '127.0.0.1',

+ 2 - 2
src/urls.py

@@ -22,7 +22,7 @@ from django import views
 
 
 import common.views as cview
-import gzyun.views as wview
+import bzyifeng.views as wview
 
 
 urlpatterns = [
@@ -31,7 +31,7 @@ urlpatterns = [
     url(r'^api/hook/$', wview.HookView.as_view()),
     url(r'^api/dashboard/', include('dashboard.urls_backstage')),
     url(r'^api/oplog/', include('operation_log.urls_backstage')),
-    url(r'^api/entcus/', include('enterprise.urls_backstage')),
+    url(r'^api/wx/', include('weixin.urls_backstage')),
 ]
 
 urlpatterns += [

src/enterprise/__init__.py → src/weixin/__init__.py


+ 78 - 0
src/weixin/cauth.py

@@ -0,0 +1,78 @@
+#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
+

+ 74 - 0
src/weixin/control_auth.py

@@ -0,0 +1,74 @@
+#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_wxauth_info(request):
+    """
+    """
+    qdata = request.json
+    need_params = ["nickname","avatar","openid"]
+    print qdata
+    print need_params
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    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.avatar = vals.get("avatar")
+    obj.save()
+    return obj
+
+
+def get_wxauth_info(request):
+    """
+    """
+    #qdata = request.json
+    #need_params = ["nickname","avatar","openid"]
+    #mse = ccf.check_params(*need_params,**qdata)
+    #if mse:
+    #    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.avatar = vals.get("avatar")
+    #obj.save()
+    #
+    data = {
+        "id":1,
+        "name":"肖小肖",
+        "sex":1,
+        "idno":"12321312312",
+        "education":"本科",
+        "phone":"15982456282",
+        "class_id":12,
+        "company":"网安",
+        "subject_id":12,
+        "subject_item":"特种人员|电工作业|准操项目|培训类型",
+        "train_type":1,
+        "receive_card":"邮寄",
+        "area":"四川|巴中|巴州区",
+        "address":"回风大道15号",
+        "remark":"备注1",
+        "idnoimg_face":"https://www.scxjc.club/test.png",
+        "idnoimg_back":"https://www.scxjc.club/test2.png",
+        "halfbody_img":"https://www.scxjc.club/tes3.png",
+        "education_img":"https://www.scxjc.club/test4.png",
+        "oldcard_img":"https://www.scxjc.club/test4.png",
+        "price":1800
+    }
+    return data
+
+
+
+
+
+
+
+

+ 97 - 0
src/weixin/control_bankcard.py

@@ -0,0 +1,97 @@
+#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))
+
+
+
+

+ 81 - 0
src/weixin/control_department.py

@@ -0,0 +1,81 @@
+#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)
+
+    
+
+
+
+

src/enterprise/control_organization.py → src/weixin/control_organization.py


src/enterprise/control_permission.py → src/weixin/control_permission.py


src/enterprise/control_role.py → src/weixin/control_role.py


+ 233 - 0
src/weixin/control_user.py

@@ -0,0 +1,233 @@
+#coding=utf-8
+'''
+'''
+import json
+import datetime
+import logging
+import re
+
+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
+
+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
+    login_info = 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 login_info or not password:
+        raise ce.TipException(u"账户或密码不能为空!")
+    #if not idcode:
+    #    raise ce.TipException(u"验证码不能为空!")
+    #if idcode.upper() != captcha.upper():
+    #    raise ce.TipException(u"验证码错误!")
+
+    user = auth.authenticate(request, account=login_info, pwd=password)
+    if user:
+        auth.login(request, user)
+        return user
+    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
+    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)
+

+ 382 - 0
src/weixin/controls.py

@@ -0,0 +1,382 @@
+#coding=utf-8
+'''
+'''
+import json,time
+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
+import wzhifuSDK as wxpay
+
+def get_index_data(request):
+    """
+    """
+    qset = cm.Category.objects.all()
+    qdata = list(qset.values())
+    for i,qd in enumerate(qdata):
+        if i<6:
+            qd["type"] = "nav"
+        else:
+            qd["type"] = "article"
+            qd["list"] = list(cm.Article.objects.filter(category__id=qd["id"]).values())
+        if qd["name"]==u"头条通知": 
+            qd["type"] = "notice"
+            qd["list"] = list(cm.Article.objects.filter(category__id=qd["id"]).values())
+        if "{id}" in qd["path"]:
+            artcs = list(cm.Article.objects.filter(category__id=qd["id"]).order_by("order").values())
+            aid = artcs[0]["id"] if artcs else 0
+            qd["path"] = qd["path"].replace("{id}",str(aid))
+    return qdata
+
+
+def get_article_info(request):
+    qdata = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    id = qdata.get("id")
+    data = list(cm.Article.objects.filter(id=id).values())
+    data = data[0] if data else {}
+    return data
+
+def get_intro_info(request):
+    """考场和联系我们专用
+    """
+    qdata = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    id = qdata.get("id")
+    data = {"id":"1","title":"sfsfd","content":"","ctime":"2020-01-01 00:00:01"}
+    data = {"id":1,"title":u"联系我们","phone":"0827-8589102","address":u"巴中市江北车站三楼(体检门诊第一个办公室)","imgs":["https://www.scxjc.club/images/jgjj.png","https://www.scxjc.club/images/jgjj.png"],"content":u"详情...."}
+    return data
+
+def get_signup_list(request):
+    """
+    """
+    data = [
+        {"relaname":u"肖小肖",
+        "phone":"15982456282",
+        "class_name":u"一班",
+        "class_id":1,
+        "subject_item":u"安全生产管理|电工作业|高压电工",
+        "class_hour":30,
+        "class_hour_finished":10,
+        "train_type":u"新办",
+        "order_status":0,
+        "ctime":"2020-05-05 22:11:12",
+        "id":1
+        }
+    ]
+    qset = cm.SignupOrders.objects.filter(user_id=2)
+    qdata = list(qset.values())
+    for qd in qdata:
+        qd["subject_item"] = u"特种作业|电工|高压电工"
+        qd["class_name"] = cm.Class.objects.filter(id=qd["class_id"]).first().name
+        qd["class_hour"] = cm.Class.objects.filter(id=qd["class_id"]).first().class_hour
+    return qdata
+
+def get_signup_info(request):
+    qdata = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    id = qdata.get("id")
+    data = list(cm.SignupOrders.objects.filter(id=id).values())
+    data = data[0] if data else {}
+    return data
+
+def get_class_list(request):
+    """
+    """
+    data = [{
+        "type":u"特种作业1",
+        "classes":[
+        {
+        "id":1,
+        "class_name":u"高压电一班",    
+        "price":1800.00,    
+        "class_time":"2020.04.01,2020.05.01",    
+        "thresh_count":100,
+        "signuped_count":10},
+        {
+        "id":1,
+        "class_name":u"高压电一班",    
+        "price":1800.00,    
+        "class_time":"2020.04.01,2020.05.01",    
+        "thresh_count":100,
+        "signuped_count":10}
+        ]
+    }]
+    qset = cm.Class.objects.filter(status=1)
+    qdata = list(qset.values())
+    dct = {}
+    data = []
+    print qdata,4444444444444
+    for qd in qdata:
+        qd["price_new"] = 1000.00
+        qd["price_re"] = 1000.00
+        qd["price_change"] = 2000.00
+        qd["class_time"] = qd["signup_time"]
+        qd["thresh_count"] = qd["signup_limit"]
+        if dct.has_key(qd["subject_name"]):
+            dct[qd["subject_name"]].append(qd)
+        else:
+            dct[qd["subject_name"]] = [qd]
+    for k,v in dct.items():
+        data.append({"type":k,"classes":v})
+    return data
+
+
+def get_training_list(request):
+    """
+    """
+    data = {
+        "videos":[{
+            "title":u"高压电工实操课程",     
+            "image":u"https://www.scxjc.club/images/jgjj.png",     
+            "url":u"https://www.scxjc.club/demo.mp4",     
+            "class_hour":20,     
+            "total_time":"45:32",     
+            "finished_time":"30:32",
+            "status":1
+        }],     
+        "papers":[{
+            "id":1, 
+            "title":u"高压电工实操模拟试题",     
+            "class_hour":20,     
+            "full_mark":100,     
+            "time_limit":60,     
+            "mark":90,     
+            "status":1     
+        }]
+    }
+    return data
+
+
+def get_paper_info(request):
+    qdata = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    id = qdata.get("id")
+    data = {
+        "id":1, 
+        "title":u"高压电工实操模拟试题",     
+        "class_hour":20,     
+        "full_mark":100,     
+        "time_limit":60,     
+        "mark":90,     
+        "status":1,
+        "questions":[
+            {
+                "id":1,
+                "type":1,
+                "title":u"欧姆定律是什么",
+                "options":[u"A、电阻",u"B、电流"],
+                "stand_answer":"A",
+                "myanswer":"A"
+            },
+            {
+                "id":2,
+                "type":2,
+                "title":u"欧姆定律是什么",
+                "options":[u"A、电阻",u"B、电流"],
+                "stand_answer":["A","B"],
+                "myanswer":["A","B"]
+            },
+            {
+                "id":3,
+                "type":3,
+                "title":u"电流等于电压除电阻",
+                "options":[u"对",u"错"],
+                "stand_answer":[u"对"],
+                "myanswer":[u"对"]
+            } 
+        ]
+    }
+    return data
+
+
+def add_signup(request):
+    """
+    """
+    qdata = request.json
+    need_params = ["name","sex","idno","education","phone",
+        "train_type","receive_card","price"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    need_params.extend(["company","class_id","remark","idnoimg_face","idnoimg_back","halfbody_img","education_img","oldcard_img","area","address","subject_id","subject_item"])
+    vals = ccf.get_need_params(*need_params,**qdata)
+    vals["cid"] = 1
+    vals["user_id"] = 2
+    obj = cm.SignupOrders.objects.create(**vals)
+    return obj.id
+
+
+def update_signup(request):
+    """
+    """
+    qdata = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    id = qdata.pop("id")
+    need_params.extend(["name","sex","idno","education","phone","train_type","receive_card","area","price","company","class_id","remark","idnoimg_face","idnoimg_back","halfbody_img","education_img","oldcard_img","subject_item","subject_id","address"])
+    vals = ccf.get_need_params(*need_params,**qdata)
+    vals["cid"] = 1
+    obj = cm.SignupOrders.objects.filter(id=id).update(**vals)
+    return obj
+
+
+def get_yrxindex(request):
+    """
+    """
+    recs = cm.ClassRoom.objects.all()
+    recs = list(recs.values())
+    teachers = [{
+        "name":u"肖老师",
+        "avatar":"肖老师",
+        "lessons_count":2,
+        "students":200
+    }]
+    data = {
+        "rec":recs,     
+        "lessons":recs,     
+        "teachers":teachers     
+    }
+    return data
+
+
+def get_yrxlist(request):
+    """
+    """
+    recs = cm.ClassRoom.objects.all()
+    recs = list(recs.values())
+    teachers = [{
+        "name":u"肖老师",
+        "avatar":"肖老师",
+        "lessons_count":2,
+        "students":200
+    }]
+    data = {
+        "rec":recs,     
+        "lessons":recs,     
+        "teachers":teachers     
+    }
+    return recs
+
+
+def get_yrxdetail(request):
+    qdata = request.json
+    need_params = ["id"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    id = qdata.get("id")
+    data = list(cm.ClassRoom.objects.filter(id=id).values())
+    data = data[0] if data else {}
+    if data:
+        lessons = list(cm.Lessons.objects.filter(classroom_id=id).values())
+        data["lessons"] = lessons
+    return data
+
+
+def get_subject_tree(sub=None,data=None):
+    """
+    """
+    roots = list(cm.Subject.objects.filter(pid=0).values())
+    print roots,777777
+    for rn in roots:
+        rn["children"] = list(cm.Subject.objects.filter(pid=rn["id"]).values())
+        for rnn in rn["children"]:
+            rnn["children"] = list(cm.Subject.objects.filter(pid=rnn["id"]).values())
+    return roots
+
+
+def get_subjectitem_tree(request):
+    """
+    """
+    data = [{
+        "id":1,
+        "intro":u"说明",
+        "name":u"特种作业",     
+        "price_new":1200,     
+        "price_re":120,     
+        "price_change":120,     
+        "children":[{
+            "id":2,
+            "price_new":1200,     
+            "price_re":120,     
+            "price_change":120,     
+            "name":u"电工作业",    
+            "intro":u"说明",
+            "children":[{"id":3,"name":u"低压电工","children":[],"intro":u"说明"}]
+        }]},
+        {
+        "id":4,
+        "price_new":1200,     
+        "price_re":120,     
+        "price_change":120,     
+        "name":u"安全生产",     
+        "intro":u"说明",
+        "children":[{
+            "price_new":1200,     
+            "price_re":120,     
+            "price_change":120,     
+            "id":5,
+            "name":u"子分类1",    
+            "intro":u"说明",
+            "children":[{"id":6,"name":u"子分类2","children":[],"intro":u"说明"}]
+        }]}
+    ]
+    data = get_subject_tree()
+    return data
+
+
+def post_paper(request):
+    qdata = request.json
+    need_params = ["paper_id","questions"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    paper_id = qdata.get("paper_id")
+    return True
+
+
+def save_video_time(request):
+    qdata = request.json
+    need_params = ["video_id","time"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    paper_id = qdata.get("paper_id")
+    return True
+
+
+def get_docs_list(request):
+    data = [{
+        "name":u"报名表格",     
+        "url":u"https://www.scxjc.club/test.docx"     
+    }]
+    return data
+
+def do_signup_pay(request):
+    qdata = request.json
+    need_params = ["signup_id","total_fee"]
+    mse = ccf.check_params(*need_params,**qdata)
+    if mse:
+        raise ce.TipException(mse)
+    signup_id = str(qdata.get("signup_id"))+str(int(time.time()))
+    total_fee = str(qdata.get("total_fee"))
+    openid = "ow7pX470Bl6IPeM188gNT8PjMBlw"
+    prepayinfo = wxpay.get_wx_unifiedorder(signup_id,total_fee,openid)
+    return prepayinfo
+

src/enterprise/lock_account.py → src/weixin/lock_account.py


src/enterprise/models.py → src/weixin/models.py


+ 3 - 3
src/enterprise/password_handle.py

@@ -14,12 +14,12 @@ def check_password(new,old):
     np = hashlib.md5(new).hexdigest().upper()
     return np==old
 
-def make_password(pwd):
+def make_password(pwd,isdefault=None):
     """
     @attention: 密码加密
     """
-    if not re.search(r'^.*(?=.{8,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd):
-        raise ceil.TipException(u"密码不符合符号要求!")
+    #if not re.search(r'^.*(?=.{6,15})(?=.*\d)(?=.*[A-Z]{1,})(?=.*[a-z]{1,})(?=.*[!@#$%^&*?\(\)]).*$',pwd) and not isdefault:
+    #    raise ceil.TipException(u"密码不符合符号要求!")
     return hashlib.md5(pwd).hexdigest().upper()
 
 def make_default_password(pwd):

+ 31 - 0
src/weixin/urls_backstage.py

@@ -0,0 +1,31 @@
+# coding=utf-8
+'''
+'''
+from django.conf.urls import url
+from . import views,views_backstage
+
+urlpatterns = [
+    # 运营
+    url(r'^authinfo$', views.AuthinfoView.as_view()),
+    url(r'^openid$', views.OpenidView.as_view()),
+    url(r'^index$', views.IndexView.as_view()),
+    url(r'^article$', views.ArticleView.as_view()),
+    url(r'^intro$', views.IntroView.as_view()),
+    url(r'^signup/list$', views.SignUpListView.as_view()),
+    url(r'^signup$', views.SignUpView.as_view()),
+    url(r'^signup/pay$', views.SignUpPayView.as_view()),
+    url(r'^class/list$', views.ClassListView.as_view()),
+    url(r'^training/list$', views.TrainingListView.as_view()),
+    url(r'^paper/info$', views.PaperView.as_view()),
+    url(r'^uploadfile$', views.UploadFileView.as_view()),
+    url(r'^sujectitem$', views.GetSubjectView.as_view()),
+    url(r'^postpaper$', views.PostPaperView.as_view()),
+    url(r'^savevtime$', views.SaveVideoTimeView.as_view()),
+    url(r'^docs$', views.GetDocsListView.as_view()),
+    url(r'^notice$', views.GetNoticeListView.as_view()),
+    #猿人学
+    url(r'^yrxindex$', views.YuanrenxueIndexView.as_view()),
+    url(r'^yrxlist$', views.YuanrenxueListView.as_view()),
+    url(r'^yrxdetail$', views.YuanrenxueDetailView.as_view()),
+]
+

+ 367 - 0
src/weixin/views.py

@@ -0,0 +1,367 @@
+# coding=utf-8
+from __future__ import unicode_literals
+import requests
+import random
+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
+import common.common_control as ccc
+import common.common_functions as ccf
+import weixin.control_auth as ca
+import weixin.controls as ctl
+
+class YuanrenxueIndexView(cv.BaseView):
+    def get(self,request):
+        """
+        """
+        try:
+            rst = ctl.get_yrxindex(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+class YuanrenxueListView(cv.BaseView):
+    def get(self,request):
+        """
+        """
+        try:
+            rst = ctl.get_yrxlist(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class YuanrenxueDetailView(cv.BaseView):
+    def get(self,request):
+        """
+        """
+        try:
+            rst = ctl.get_yrxdetail(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+
+class AuthinfoView(cv.BaseView):
+    def get(self,request):
+        """#获取用户信息(小程序)
+        """
+        try:
+            rst = ca.get_wxauth_info(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def post(self, request):
+        """#保存微信授权信息(小程序)
+        @nickname:"新",昵称
+        @avatar:"",头像
+        @openid:"",openid
+        """
+        try:
+            rst = ca.add_wxauth_info(request)
+            return cv.to_suc({"uid":rst.id})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class IndexView(cv.BaseView):
+    def get(self, request):
+        """#首页导航和top数据(小程序)
+        """
+        try:
+            rst = ctl.get_index_data(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class ArticleView(cv.BaseView):
+    def get(self, request):
+        """#文章详情(小程序)
+        @id:1,文章id
+        """
+        try:
+            rst = ctl.get_article_info(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class IntroView(cv.BaseView):
+    def get(self, request):
+        """#介绍类详情,供考场介绍和联系我们两个模块使用(小程序)
+        @id:1,详情id
+        """
+        try:
+            rst = ctl.get_intro_info(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class SignUpListView(cv.BaseView):
+    def get(self, request):
+        """#报名列表(小程序)
+        """
+        try:
+            rst = ctl.get_signup_list(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class ClassListView(cv.BaseView):
+    def get(self, request):
+        """#班级列表(小程序)
+        @subject_item0:"特种作业"
+        @subject_item1:"电工作业"
+        @subject_item2:"高压电工"
+        """
+        try:
+            rst = ctl.get_class_list(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class TrainingListView(cv.BaseView):
+    def get(self, request):
+        """#在线培训列表(小程序)
+        """
+        try:
+            rst = ctl.get_training_list(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class PaperView(cv.BaseView):
+    def get(self, request):
+        """#获取试题详情(小程序)
+        """
+        try:
+            rst = ctl.get_paper_info(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class PostPaperView(cv.BaseView):
+    def post(self, request):
+        """#交卷接口(小程序)
+        @paper_id:1,试卷接口
+        @questions:[{"id":1,"answer":"A"}]
+        """
+        try:
+            rst = ctl.post_paper(request)
+            return cv.to_suc({"score":90})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class SaveVideoTimeView(cv.BaseView):
+    def post(self, request):
+        """#保存视频播放进度(小程序)
+        @video_id:1,试卷接口
+        @time:"00:12:33"
+        """
+        try:
+            rst = ctl.save_video_time(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class GetDocsListView(cv.BaseView):
+    def get(self, request):
+        """#我的文件列表(小程序)
+        """
+        try:
+            rst = ctl.get_docs_list(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+class GetNoticeListView(cv.BaseView):
+    def get(self, request):
+        """#我的消息(小程序)
+        """
+        try:
+            rst = ctl.get_docs_list(request)
+            data = [{
+                    "id":"1", 
+                    "title":u"标题", 
+                    "content":u"消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容消息内容" 
+                }]
+            return cv.to_suc(data)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class GetSubjectView(cv.BaseView):
+    def get(self, request):
+        """#获取培训类别/作业类别/准操项目(小程序)
+        """
+        try:
+            rst = ctl.get_subjectitem_tree(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class SignUpView(cv.BaseView):
+    def post(self, request):
+        """#新增报名(小程序)
+        @name:"肖小肖",姓名
+        @sex:1,性别1/2
+        @idno:"12321312312",身份证号
+        @education:"本科",学历/教育/文化
+        @phone:"15982456282",手机号
+        @class_id:12,班级id(特种人员不传)
+        @company:"网安",公司(非必填)
+        @subject_id:12,培训科目id
+        @subject_item:"特种人员|电工作业|准操项目|培训类型",培训科目
+        @train_type:"新办",培训类型
+        @receive_card:"邮寄",领取方式
+        @area:"四川|巴中|巴州区",区域
+        @address:"回风大道15号",地址
+        @remark:"备注1",备注(非必填)
+        @idnoimg_face:"",正面照
+        @idnoimg_back:"",反面照
+        @halfbody_img:"",半身照
+        @education_img:"",学历照
+        @price:1800.00,价格
+        """
+        try:
+            rst = ctl.add_signup(request)
+            return cv.to_suc({"id":rst})
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def put(self, request):
+        """#修改报名(小程序)
+        @id:12,报名id,
+        @name:"肖小肖",姓名
+        @sex:1,性别1/2
+        @idno:"12321312312",身份证号
+        @education:"本科",学历/教育/文化
+        @phone:"15982456282",手机号
+        @class_id:12,班级id(特种人员不传)
+        @company:"网安",公司(非必填)
+        @subject_id:12,培训科目id
+        @subject_item:"特种人员|电工作业|准操项目|培训类型",培训科目
+        @train_type:"新办",培训类型
+        @receive_card:"邮寄",领取方式
+        @area:"四川|巴中|巴州区",区域
+        @address:"回风大道15号",地址
+        @remark:"备注1",备注(非必填)
+        @idnoimg_face:"",正面照
+        @idnoimg_back:"",反面照
+        @halfbody_img:"",半身照
+        @education_img:"",学历照
+        @price:1800.00,价格
+        """
+        try:
+            rst = ctl.update_signup(request)
+            return cv.to_suc()
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+    def get(self, request):
+        """#报名列表(小程序)
+        >order_status:0,0/1/2/3=待审核/审核通过待支付/已支付/已完成
+        """
+        try:
+            rst = ctl.get_signup_info(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+class SignUpPayView(cv.BaseView):
+    def post(self,request):
+        """#支付接口
+        """
+        try:
+            rst = ctl.do_signup_pay(request)
+            return cv.to_suc(rst)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+
+
+class OpenidView(cv.BaseView):
+    def get(self,request):
+        """
+        #获取openid
+        @code:1212
+        """
+        code = request.json.get("code")
+        open_id = cache.get(code)
+        if open_id:
+            return cv.to_suc({"openid":open_id})
+        else:
+
+            APPID = 'wxecaa5147d8564e89'                                               
+            SECRET='691bb4a9bb4cb30b0dd1e03a0bb2e6f6'                                  
+            APPID = 'wx2938132b773c7b5a'                                               
+            SECRET='b32b08a8757cc34b1ee5490af897b065'                                  
+
+            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)
+            #get_token_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code' %(APPID,SECRET,code)
+            get_token_url = 'https://api.weixin.qq.com/sns/jscode2session?appid={}&secret={}&js_code={}&grant_type=authorization_code' .format(APPID,SECRET,code)
+
+            res = requests.get(get_token_url).json()                                   
+            print res,3333
+            if res.has_key('openid'):                                                 
+                open_id = res['openid']                                               
+
+                cache.set(code,open_id,24*3600)
+            else:                                                                      
+                open_id = ''                                                           
+            if open_id:
+                return cv.to_suc({"openid":open_id})
+            else:
+                return cv.to_fail(u"获取用户信息出错!")
+
+
+class UploadFileView(cv.BaseView):
+    def post(self, request):
+        """
+        #文件上传(小程序)
+        @file:"",文件对象
+        """
+        import time
+        upload_file = request.FILES['file']
+        dest = settings.STATIC_ROOT + "/upload/"+str(int(time.time())) + upload_file.name
+        with open(dest,"wb+") as f:
+            for chunk in upload_file.chunks():
+                f.write(chunk)
+        f.close()
+        url = dest.replace(settings.STATIC_ROOT,"https://www.scxjc.club")
+        return cv.to_suc({"url":url})

+ 299 - 0
src/weixin/views_backstage.py

@@ -0,0 +1,299 @@
+#-*-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.AuthView):
+    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)

src/enterprise/views_permission.py → src/weixin/views_permission.py


+ 342 - 0
src/weixin/wzhifuSDK.py

@@ -0,0 +1,342 @@
+#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 = "wx2938132b773c7b5a"
+    #JSAPI接口中获取openid,审核后在公众平台开启开发模式后可查看
+    APPSECRET = "b32b08a8757cc34b1ee5490af897b065"
+    #受理商ID,身份标识
+    MCHID = "1590893081"
+    #商户支付密钥Key。审核通过后,在微信发送的邮件中查看
+    KEY = "kAHuCc2g4MINcLRk3o0lxT6J1Z04WuZq"
+
+   
+
+    #=======【异步通知url设置】===================================
+    #异步通知url,商户根据实际开发过程设定
+    NOTIFY_URL = "http://baoming.siyusai.com/wxjspay/weixin_qrcode_notify/"
+
+    #=======【JSAPI路径设置】===================================
+    #获取access_token过程中的跳转uri,通过跳转将code传入jsapi支付页面
+    #JS_API_CALL_URL = "http://www.huodongjia.com/pay/?showwxpaytitle=1"
+    JS_API_CALL_URL = "http://baoming.siyusai.com/wxjspay/forwxjspay/"
+
+    #=======【证书路径设置】=====================================
+    #证书路径,注意应该填写绝对路径
+    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)
+        #签名步骤三:MD5加密
+        String = hashlib.md5(String).hexdigest()
+        #签名步骤四:所有字符转为大写
+        result_ = String.upper()
+        return result_
+
+    def arrayToXml(self, arr):
+        """array转xml"""
+        xml = ["<xml>"]
+        for k, v in arr.iteritems():
+            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
+
+    def postXmlCurl(self, xml, url, second=30):
+        """以post方式提交xml到对应的接口url"""
+        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 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"""
+        return  self.arrayToXml(self.parameters)
+
+    def postXml(self):
+        """post请求xml"""
+        xml = self.createXml()
+        self.response = self.postXmlCurl(xml, self.url, self.curl_timeout)
+        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", "total_fee")):
+            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["notify_url"] = WxPayConf_pub.NOTIFY_URL  #随机字符串
+        self.parameters["body"] = "培训报名费"  #随机字符串
+        if self.parameters.has_key("sign"):
+            self.parameters.pop("sign")
+        sign = self.getSign(self.parameters)
+        print self.parameters
+        self.parameters["sign"] = sign  #签名
+        return  self.arrayToXml(self.parameters)
+
+    def getPrepayId(self):
+        """获取prepay_id"""
+        self.postXml()
+        self.result = self.xmlToArray(self.response)
+        print self.result
+        return self.result
+
+    def geth5url(self):
+        """获取prepay_id"""
+        self.postXml()
+        self.result = self.xmlToArray(self.response)
+        prepay_id = self.result["mweb_url"]
+        return prepay_id
+
+def get_wx_unifiedorder(out_trade_no,total_fee,openid,trade_type="JSAPI"):
+    par_obj = UnifiedOrder_pub()
+    par_obj.setParameter('out_trade_no',out_trade_no)
+    par_obj.setParameter('total_fee',total_fee)
+    par_obj.setParameter('openid',openid)
+    par_obj.setParameter('trade_type',trade_type)
+    par_obj.createXml()
+    return par_obj.getPrepayId()
+
+
+
+
+if __name__ == "__main__":
+    pass

BIN
static/images/jgjj.png


BIN
static/images/kcjs.png


BIN
static/images/lxwm.png


BIN
static/images/pxjh.png


BIN
static/images/zxbm.png


BIN
static/images/zxpx.png


BIN
static/tes2.png


BIN
static/test.png


BIN
static/test3.png


BIN
static/test4.png


BIN
static/upload/1588754976timg (4).jpg


BIN
static/upload/1588821309tmp_1b58081293c0fd2f1eb8da966fcdb090.jpg


BIN
static/upload/1588821838tmp_56e21ec0e1b6ad9166726142f30b9570.jpg


BIN
static/upload/1588821899tmp_b07a29631af01002362bd8e745857a8e.jpg


BIN
static/upload/1588821951tmp_41e1ad93ade9b9e91373da8e0746a87b.jpg


BIN
static/upload/1588821986tmp_159339d369c6a563c68433dcc29e1667.jpg


BIN
static/upload/1588822035tmp_24db41bceaa11fa1ca8cc41ad4d0588d.jpg


BIN
static/upload/1588822097tmp_408e032ea6deb80fd117002653b5d1ce.jpg


BIN
static/upload/1588822121tmp_6003831d42ca17de6d8709842751b511.jpg


BIN
static/upload/1588822196tmp_9988f901605db4ce75e26c7bc55b3789.jpg


BIN
static/upload/1588822240tmp_f99197e54ccb6060aefa60fe18d4b63f.jpg


BIN
static/upload/1588946415tmp_24a1499d051efeb165144b0de1150d09.jpg


BIN
static/upload/1588946507tmp_de414acc6be1332ea44feb59efcae4fa.jpg


BIN
static/upload/1588946598tmp_1321ea47f3f66f5f6e887660e0de95dd.jpg


BIN
static/upload/1588946724tmp_22bd03b099acd8702c0df2e763991d27.jpg


BIN
static/upload/1588946758tmp_f2cdcec651a67cc371eeec7dd1af3e77.jpg


BIN
static/upload/1589022535tmp_7b534b18584060c9fe99fa6d358d21da46745d456b3a8cb9.jpg


BIN
static/upload/1589022545tmp_74e8880b255ad22542d6318e4a106cbe4fdab949751d0bf3.jpg


BIN
static/upload/1589022556tmp_8319eacda80011f2f660059af4710e6e1639c0beca6a2684.jpg


BIN
static/upload/1589022564tmp_6d497eda85e5cbe9e368945e2344d410e26b076a8a505acc.jpg


BIN
static/upload/1589026588tmp_bba258dd0bbabd1760d676f030e20b09.jpg


BIN
static/upload/1589071686tmp_9612e9141c31e7797fac7f1ed73ae69a.jpg


BIN
static/upload/1589071963tmp_63f6bd41f3f63971ce35ec0e3dcb3893.jpg


BIN
static/upload/testvideo.mp4