Gogs 5 anos atrás
pai
commit
93b5f119e4

+ 0 - 5
src/account/cauth.py

@@ -1,9 +1,4 @@
 #coding=utf-8
-'''
-Created on 2017年11月2日
-
-@author: bailiangjun
-'''
 import logging
 import datetime
 

+ 34 - 9
src/account/control_user.py

@@ -174,7 +174,7 @@ def login_user(request):
     """
     info = request.json
     login_info = info.get('username')
-    password = info.get('pwd')
+    password = info.get('password')
     captcha_id = info.get('captcha_id')
     idcode = info.get('idcode')
     captcha = cache.get(captcha_id, '')
@@ -199,20 +199,20 @@ def reset_password(request):
     @attention: 重置密码
     """
     qdata = request.json
-    need_params = ["oldpwd","password"]
+    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
-    oldpwd = qdata.get("oldpwd")
-    newpwd = qdata.get("password")
-    oldpassword = cm.UserInfo.objects.filter(id=uid).first().password
-    if ph.make_password(oldpwd) != oldpassword:
-        raise ce.TipException(u"原始密码错误!")
-    pwd = ph.make_password(newpwd)
-    cm.UserInfo.objects.filter(pk=uid).update(password=pwd)
+    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):
@@ -230,3 +230,28 @@ def reset_user_password(request):
     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

+ 2 - 0
src/account/urls_backstage.py

@@ -7,6 +7,8 @@ from account import views,views_backstage
 urlpatterns = [
     # 运营
     url(r'^auth$', views.LoginView.as_view()),
+    url(r'^regist$', views.RegistView.as_view()),
+    url(r'^department$', views_backstage.DepartmentView.as_view()),
     url(r'^logout$', views.LogoutView.as_view()),
     url(r'^info$', views_backstage.InfoView.as_view()),
     url(r'^idcode$', views.CaptchaView.as_view()),

+ 19 - 2
src/account/views.py

@@ -23,7 +23,8 @@ class GetPhoneCodeView(cv.AuthView):
         return rst,msg
 
     def post(self, request):
-        """获取行业数据接口
+        """#获取短信验证码
+        @phone:"15982456282",手机号
         """
         uid = request.user.id
         qdata = request.json
@@ -34,7 +35,8 @@ class GetPhoneCodeView(cv.AuthView):
         rcode = "".join(random.sample('1234567890',6))
         valid_time = 60*2
 
-        rst,msg = self.send_resetpwd_code_msg([phone],[rcode,2])
+        #rst,msg = self.send_resetpwd_code_msg([phone],[rcode,2])
+        rst = True
         if rst:
             cache.set(phone,rcode,valid_time)
             return cv.to_suc({})
@@ -83,4 +85,19 @@ class LogoutView(cv.AuthView):
         auth.logout(request)
         return cv.to_suc()
 
+class RegistView(cv.BaseView):
+    def post(self,request):
+        """#用户注册
+        @realname:姓名
+        @phone:"15982456282",手机号
+        @phcode:"1234",短信验证码
+        @password:"123456",密码
+        @repassword:"123456",确认密码
+        """
+        try:
+            rst = cr.regist_user(request)
+        except Exception as e:
+            cv.tracefail()
+            return cv.to_fail(e)
+        return cv.to_suc()
 

+ 14 - 4
src/account/views_backstage.py

@@ -309,13 +309,14 @@ class OrganizationInfoView(cv.AuthView):
             return cv.to_fail(e)
 
 
-class ResetPwdView(cv.AuthView):
+class ResetPwdView(cv.BaseView):
     def put(self, request):
         """
-        #修改用户密码
-        @uid:10,用户id不传则默认当前用户
-        @oldpwd:"",旧密码
+        #重置密码(忘记密码)
+        @phone:"15982456282",手机号
         @password:"",新密码
+        @repassword:"",确认密码
+        @phcode:"123",验证码
         """
         try:
             cu.reset_password(request)
@@ -338,3 +339,12 @@ class ResetUserPwdView(cv.AuthView):
         except Exception as e:
             return cv.to_fail(e)
 
+
+class DepartmentView(cv.AuthView):
+    def post(self,request):
+        """
+        #新增部门
+        @name:"综管部",部门名称
+        @pid:1,上级部门
+        @permissions:["CusManage.*.*","CusManage.MyCus.*"]
+        """

+ 4 - 0
src/common/core_views.py

@@ -12,6 +12,7 @@ from django import http
 from django.contrib.sessions.backends.cache import SessionStore
 from django.core.cache import cache
 from django.http import HttpResponse, JsonResponse
+from django.shortcuts import render
 from django.utils.decorators import method_decorator
 from django.views import View
 from django.views.decorators.csrf import csrf_exempt
@@ -333,6 +334,9 @@ def to_redirect(curl):
     info["url"] = curl
     return JsonResponse(info)
 
+def to_render(request,template,data={}):
+    return render(request,template,data)
+
 
 def raw_json(data):
     return JsonResponse(data, safe=False)

+ 92 - 41
src/common/models.py

@@ -6,6 +6,21 @@ from django.db import models
 
 
 # ---------------- 用户部分 ------------------
+class Department(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)
+
+    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"部门"
+        app_label = "common"
+
+
 class UserInfo(models.Model):
     # 基础属性
     name = models.CharField(u"名字", max_length=255, blank=True)
@@ -13,20 +28,22 @@ class UserInfo(models.Model):
     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)
-    parent_id = models.CharField(u"创建人ID", max_length=16, blank=True,null=True)
-    remark = models.TextField(u"备注", blank=True)
+    remark = models.TextField(u"备注", blank=True,null=True)
+    avatar = models.CharField(u"手机号", max_length=64, blank=True,null=True)
+    vcard = models.TextField(u"电子名片", blank=True,null=True)
 
-    last_login = models.CharField(u"上次登录时间", max_length=128, blank=True, db_column='last_login_time')
-    last_login_ip = models.CharField(u"上次登录IP", max_length=128, blank=True)
-    is_active = models.CharField(u"是否激活可用", max_length=4, default="1")  # 0-未激活;1-已激活
+    last_login = models.CharField(u"上次登录时间", max_length=128, blank=True,null=True,db_column='last_login_time')
+    last_login_ip = models.CharField(u"上次登录IP", max_length=128, blank=True,null=True)
+    is_active = models.CharField(u"是否激活可用", max_length=4, default="1")
     # 功能权限及数据权限
-    role = models.ForeignKey("Role", verbose_name=u"所属角色", blank=True, null=True)
+    department = models.ForeignKey("Department", verbose_name=u"所属部门", blank=True, null=True)
 
-    cperson = models.CharField(u"创建人", max_length=255, blank=True)
+    cid = models.IntegerField(u"创建人ID",blank=True,null=True)
+    cperson = models.CharField(u"创建人", max_length=255, blank=True,null=True)
     ctime = models.DateTimeField(u"创建时间", auto_now_add=True)
 
     class Meta:
-        db_table = "admin_user"
+        db_table = "users"
         verbose_name = u"用户信息"
         app_label = "common"
 
@@ -40,23 +57,6 @@ class UserInfo(models.Model):
         return False
 
 
-class Category(models.Model):
-    name = models.CharField(u"组织名称",max_length=256,blank=True)
-    pid = models.CharField(u"父节点ID",max_length=16,blank=True)
-    isshow = models.BooleanField(u"是否显示",blank=True,null=False)
-    isnav = models.BooleanField(u"是否导航",blank=True,null=False)
-    order = models.IntegerField(u"排序字段",blank=True,null=True,default=0)
-
-    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 Permission(models.Model):
     """权限
     """
@@ -71,25 +71,10 @@ class Permission(models.Model):
         app_label = "common"
 
 
-class Role(models.Model):
-    permission = models.ManyToManyField(Permission, related_name="permission_role")
-    name = models.CharField(u"角色名称", max_length=255, blank=True)
-    desc = models.TextField(u"角色描述", blank=True)
-
-    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 = "role"
-        verbose_name = u"角色信息"
-        app_label = "common"
-
-
 class OperationLogConfig(models.Model):
     """操作日志模板配置
     """
-    op_view = models.CharField(u"操作模块", max_length=100)
+    op_view = models.CharField(u"操作模块", max_length=100,blank=True,null=True)
     op_action_flag = models.CharField(u"操作类型", max_length=50)
     op_module = models.CharField(u"操作模块",max_length=255,blank=True,null=True)
     op_template = models.TextField(u"操作日志模板")
@@ -178,4 +163,70 @@ 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)
+
+    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'产品详情')
+
+    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):
+    """交易
+    """
+    enterprise = models.ForeignKey("EnterPrise",verbose_name="企业")
+    product = models.ForeignKey("Product",verbose_name="成交产品")
+    service_period = models.CharField(u"服务周期",max_length=100)
+    remark = models.TextField(u"备注",blank=True,null=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 = "transaction"
+        verbose_name = u"企业交易"

src/xeshop/__init__.py → src/gzyun/__init__.py


src/xeshop/control_contacts.py → src/gzyun/control_contacts.py


src/xeshop/control_notice.py → src/gzyun/control_notice.py


+ 3 - 0
src/xeshop/templates/apidoc.html

@@ -40,6 +40,9 @@
 <body>
 	<div class="container">
 		<div class="left">
+            {% if project_name %}
+            <h3>{{project_name}}接口文档</h3>
+            {% endif %}
 			<ol>
 				<input id="search" type="text" style="width: 95%;margin-bottom: 10px;height: 25px;border-radius: 3px;border: 1px solid #ccc;" placeholder="请输入接口名称">
 				{% for api in apis %}

src/xeshop/urls_backstage.py → src/gzyun/urls_backstage.py


+ 2 - 1
src/xeshop/views.py

@@ -10,6 +10,7 @@ from django import http
 from django.contrib import auth
 from django.core.cache import cache
 from django.shortcuts import render
+from django.conf import settings
 
 from common import core_views as cv
 import common.models as cm
@@ -49,7 +50,7 @@ class DocView(cv.BaseView):
             except Exception as e:
                 cv.tracefail()
         isroot = request.GET.get("root",0)
-        return render(request,"apidoc.html",{"apis":apis,"isroot":isroot})
+        return render(request,"apidoc.html",{"apis":apis,"isroot":isroot,"project_name":settings.PROJECT_NAME})
 
     def post(self,request):
         """

src/xeshop/views_contacts.py → src/gzyun/views_contacts.py


src/xeshop/views_notice.py → src/gzyun/views_notice.py


+ 4 - 1
src/operation_log/OpLogMiddleware.py

@@ -23,7 +23,10 @@ class OpLogMiddleware(object):
     def record_oplog(self,request,response):
         """
         """
-        op_view = re.findall(r'func=([\.\w]+)\b',str(request.resolver_match))[0]
+        try:
+            op_view = re.findall(r'func=([\.\w]+)\b',str(request.resolver_match))[0]
+        except:
+            op_view = "testview"
         op_action_flag = request.method
         op_url = request.path.strip()
         #op_url = op_url.split("?")[0]

+ 4 - 3
src/settings/base.py

@@ -24,7 +24,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 SECRET_KEY = '19r&eh*ykwhtyg@zr0zvo(wnr_5y8qg5-1!0=a*!!$!pf3smi6'
 
 # SECURITY WARNING: don't run with debug turned on in production!
-DEBUG = True
+DEBUG = False
 
 ALLOWED_HOSTS = [
     "*"
@@ -42,7 +42,7 @@ INSTALLED_APPS = [
     'django.contrib.staticfiles',
     'common',
     'account',
-    'xeshop',
+    'gzyun',
     'operation_log',
 ]
 
@@ -118,7 +118,7 @@ DATETIME_FORMAT = "%Y-%m-%d %H:%M:%S"
 STATIC_URL = '/static/'
 
 STATICFILES_DIRS = (
-    ("",os.path.join(BASE_DIR, '../static',"center")),
+    (os.path.join(BASE_DIR, '../static')),
 )
 
 # 节点上报超时配置(单位:秒)
@@ -130,3 +130,4 @@ AUTHENTICATION_BACKENDS = [
 
 # 统计服务地址
 STATISTICS_SERVER = 'http://10.10.19.84:8090'
+PROJECT_NAME = u""

+ 1 - 1
src/settings/settings_test.py

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

+ 4 - 4
src/urls.py

@@ -22,7 +22,7 @@ from django import views
 
 
 import common.views as cview
-import xeshop.views as wview
+import gzyun.views as wview
 
 
 urlpatterns = [
@@ -33,8 +33,8 @@ urlpatterns = [
     url(r'^api/oplog/', include('operation_log.urls_backstage')),
 ]
 
-#urlpatterns += [
-#    url(r'^static/(?P<path>.*)$', views.static.serve, { 'document_root': settings.STATIC_ROOT})
-#]
+urlpatterns += [
+    #url(r'^static/(?P<path>.*)$', views.static.serve, { 'document_root': settings.STATIC_ROOT})
+]
 
 

Diferenças do arquivo suprimidas por serem muito extensas
+ 3 - 0
static/APlayer.min.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
static/APlayer.min.css.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 2 - 0
static/APlayer.min.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
static/APlayer.min.js.map


BIN
static/bg.jpg


BIN
static/bgline.png


+ 41 - 0
static/demo.html

@@ -0,0 +1,41 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title></title>
+	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
+</head>
+<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
+<link rel="stylesheet" href="APlayer.min.css">
+<script src="APlayer.min.js"></script>
+<style type="text/css">
+	.container{
+		width: 100%;
+		height: 968px;
+		background: url("bg.jpg") no-repeat;
+		background-size: cover;
+	}
+	#aplayer{
+		position: absolute;
+		top:10vh;
+		width: 90%;
+		margin: auto;
+	}
+</style>
+<body style="margin: 0px;background: #C13C71;">
+
+	<div class="container">
+		<div id="aplayer"></div>
+	</div>
+</body>
+<script type="text/javascript">
+	const ap = new APlayer({
+	    container: document.getElementById('aplayer'),
+	    audio: [{
+	        name: 'name',
+	        artist: 'artist',
+	        url: 'test.mp3',
+	        cover: 'bg.jpg'
+	    }]
+	});
+</script>
+</html>

BIN
static/test.mp3


Diferenças do arquivo suprimidas por serem muito extensas
+ 3 - 0
templates/APlayer.min.css


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
templates/APlayer.min.css.map


Diferenças do arquivo suprimidas por serem muito extensas
+ 2 - 0
templates/APlayer.min.js


Diferenças do arquivo suprimidas por serem muito extensas
+ 1 - 0
templates/APlayer.min.js.map


BIN
templates/bg.jpg


BIN
templates/bgline.png


+ 45 - 0
templates/demo.html

@@ -0,0 +1,45 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title></title>
+	<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no,viewport-fit=cover">
+</head>
+<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
+<link rel="stylesheet" href="http://118.190.145.217:8108/static/APlayer.min.css">
+<script src="http://118.190.145.217:8108/static/APlayer.min.js"></script>
+<style type="text/css">
+	.container{
+		width: 100%;
+		height: 968px;
+		background: url("http://118.190.145.217:8108/static/bg.jpg") no-repeat;
+		background-size: 100% 100%;
+	}
+	#aplayer{
+		/*position: absolute;*/
+		top:30vh;
+		width: 80%;
+		margin: auto;
+	}
+</style>
+<body style="margin: 0px;background: #C13C71;">
+
+	<div class="container">
+		<div id="aplayer">
+			
+		</div>
+	</div>
+</body>
+<script type="text/javascript">
+	var name = "{{name }}"
+	var url = "{{url }}"
+	const ap = new APlayer({
+	    container: document.getElementById('aplayer'),
+	    audio: [{
+	        name: name,
+	        artist: 'artist',
+	        url: url,
+	        cover: 'http://118.190.145.217:8108/static/bg.jpg'
+	    }]
+	});
+</script>
+</html>

BIN
templates/test.mp3