jiaweiqi 3 年之前
父節點
當前提交
8e093ad300

+ 76 - 0
apps/account/serializers.py

@@ -0,0 +1,76 @@
+# coding=utf-8
+
+from django.contrib.auth import get_user_model, authenticate
+
+from rest_framework import serializers
+from rest_framework_jwt.serializers import JSONWebTokenSerializer
+from rest_framework_jwt.settings import api_settings
+
+from utils import get_remote_addr
+from utils.exceptions import CustomError
+
+from apps.log.models import BizLog
+
+User = get_user_model()
+jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
+jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
+
+
+class JWTSerializer(JSONWebTokenSerializer):
+    def validate(self, attrs):
+        credentials = {
+            self.username_field: attrs.get(self.username_field),
+            'password': attrs.get('password')
+        }
+        if all(credentials.values()):
+            user = authenticate(**credentials)
+
+            if user:
+                if not user.is_administrator():
+                    msg = u"非工作帐号,禁止登录!"
+                    BizLog.objects.addnew(user, BizLog.INSERT, u'非管工作账号[%s]尝试登录系统,IP[%s]' % (user.username, get_remote_addr(self.request)))
+                    raise serializers.ValidationError(msg)
+                if not user.is_active:
+                    msg = u'禁用帐户,禁止登录!'
+                    BizLog.objects.addnew(user,  BizLog.INSERT,u'禁用帐户[%s]尝试登录系统,IP[%s]' % (user.username, get_remote_addr(self.request)))
+                    raise serializers.ValidationError(msg)
+
+                payload = jwt_payload_handler(user)
+                BizLog.objects.addnew(user, BizLog.INSERT, u'[%s]登录系统,IP[%s]' % (user.username,get_remote_addr(self.request)))
+                return {
+                    'token': jwt_encode_handler(payload),
+                    'user_id': user.id,
+                    'username': user.username,
+                    'name': user.name or '',
+                }
+            else:
+                msg = u'账号或者密码错误!'
+                BizLog.objects.addnew(None, BizLog.INSERT, u'登录失败[%s][%s],IP[%s]' % (attrs[self.username_field], attrs['password'], get_remote_addr(self.request)))
+                raise serializers.ValidationError(msg)
+        else:
+            msg = u'必须包含“{username field}”和“password.”'
+            msg = msg.format(username_field=self.username_field)
+            raise serializers.ValidationError(msg)
+
+
+class UserSerializer(serializers.ModelSerializer):
+    type = serializers.IntegerField(read_only=True)
+    password = serializers.CharField(write_only=True, allow_blank=True)
+
+    class Meta:
+        model = User
+        fields = '__all__'
+
+    def create(self, validated_data):
+        validated_data['type'] = User.ADMINSTRATOR
+        if validated_data['password'].strip() == '':
+            raise CustomError(u'密码不能为空!')
+        instance = super(UserSerializer, self).create(validated_data)
+        instance.set_password(validated_data['password'])
+        instance.save()
+        return instance
+
+    def update(self, instance, validated_data):
+        instance.update_item(validated_data)
+        return instance
+    

+ 13 - 0
apps/account/urls.py

@@ -0,0 +1,13 @@
+from django.conf.urls import url
+from rest_framework.routers import SimpleRouter
+from apps.account.views import *
+
+urlpatterns = [
+    url(r'^login/$', LoginView.as_view()),
+    url(r'^token_refresh/$', RefreshTokenView.as_view()),
+    url(r'^token_verify/$', VerifyTokenView.as_view())
+]
+
+router = SimpleRouter()
+router.register(r'employee', EmployeeViewSet)
+urlpatterns += router.urls

+ 92 - 0
apps/account/views.py

@@ -0,0 +1,92 @@
+# coding=utf-8
+
+from django.db import transaction
+from django.contrib.auth import get_user_model
+
+from rest_framework.decorators import action
+from rest_framework.serializers import ValidationError
+
+from rest_framework_jwt.views import ObtainJSONWebToken, RefreshJSONWebToken, VerifyJSONWebToken
+
+from utils.permission import IsAdministratorUser
+from utils.custom_modelviewset import CustomModelViewSet
+from utils.exceptions import CustomError
+from utils import response_error, response_ok
+
+from apps.log.models import BizLog
+from apps.account.serializers import JWTSerializer, UserSerializer
+from apps.account.filters import UserFilter
+
+User = get_user_model()
+
+
+class LoginView(ObtainJSONWebToken):
+    serializer_class = JWTSerializer
+
+    def post(self, request, *args, **kwargs):
+        try:
+            ser = self.serializer_class(data=request.data)
+            ser.request = request
+            if ser.is_valid(raise_exception=True):
+                return response_ok(ser.validated_data)
+        except ValidationError as e:
+            return response_error(e.detail['error'][0])
+        except CustomError as e:
+            return response_error(str(e))
+
+
+class RefreshTokenView(RefreshJSONWebToken):
+
+    def post(self, request, *args, **kwargs):
+        try:
+            ser = self.serializer_class(data=request.data)
+            if ser.is_valid(raise_exception=True):
+                return response_ok({'token': ser.validated_data['token']})
+        except ValidationError as e:
+            return response_ok({'error':True})
+        except CustomError as e:
+            return response_error(str(e))
+
+
+class VerifyTokenView(VerifyJSONWebToken):
+    def post(self, request, *args, **kwargs):
+        try:
+            ser = self.serializer_class(data=request.data)
+            if ser.is_valid(raise_exception=True):
+                return response_ok({'token': ser.validated_data['token']})
+        except ValidationError as e:
+            return response_error(u'登录状态失效,请重新登录[' + e.detail['error'][0] + ']')
+
+
+class EmployeeViewSet(CustomModelViewSet):
+    permission_classes = [IsAdministratorUser, ]
+    queryset = User.objects.filter(is_active=True, type=User.ADMINSTRATOR)
+    serializer_class = UserSerializer
+
+    def filter_queryset(self, queryset):
+        f = UserFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(EmployeeViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.INSERT, u'添加用户[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    def perform_update(self, serializer):
+        super(EmployeeViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.UPDATE, u'修改用户[%s],id=%d' % (instance.name, instance.id), validated_data)
+
+    @action(methods=['post'], detail=False)
+    def change_password(self, request):
+        new_password = request.POST.get('new_password')
+        confirm_password = request.POST.get('confirm_password')
+        old_password = request.POST.get('old_password')
+        
+        with transaction.atomic():
+            request.user.change_password(new_password, confirm_password, old_password)
+            request.user.save()
+            BizLog.objects.addnew(request.user, BizLog.UPDATE, u"修改密码[%s],id=%d" % (request.user.username, request.user.id))
+        return response_ok()

+ 0 - 0
apps/dashboard/__init__.py


+ 11 - 0
apps/dashboard/views.py

@@ -0,0 +1,11 @@
+# coding=utf-8
+
+from django.http import HttpResponseRedirect, HttpResponsePermanentRedirect
+
+def index(request):
+    user_id = request.META.get('HTTP_USER_ID')
+    token = request.META.get('HTTP_ACCESS_TOKEN')
+    if not user_id or not token:
+        return HttpResponseRedirect('/views/account/login.html')
+    else:
+        return HttpResponsePermanentRedirect("/views/index.html")

+ 2 - 2
apps/wechat/models.py

@@ -6,13 +6,13 @@ from utils.exceptions import CustomError
 
 
 class Wechat(models.Model):
-    appid = models.CharField(max_length=512, verbose_name=u'小程序appid')
+    appid = models.CharField(max_length=512, verbose_name=u'小程序appid', editable=False)
     secret = models.CharField(max_length=512, verbose_name=u'小程序秘钥', null=True, blank=True)
     agent_num = models.CharField(max_length=512, verbose_name=u'商户号', null=True, blank=True)
     agent_key = models.CharField(max_length=512, verbose_name=u'商户密钥', null=True, blank=True)
     sms_sign = models.CharField(verbose_name=u'短信SIGN', max_length=200, null=True, blank=True)
     sms_token = models.CharField(verbose_name=u'短信TOKEN', max_length=200, null=True, blank=True)
-    Privacy_statement = models.TextField(verbose_name=u'隐私声明', null=True, blank=True)
+    privacy_statement = models.TextField(verbose_name=u'隐私声明', null=True, blank=True)
 
     class Meta:
         db_table = "wechat"

+ 16 - 0
apps/wechat/serializers.py

@@ -0,0 +1,16 @@
+# coding=utf-8
+
+from rest_framework import serializers
+
+from apps.wechat.models import Wechat
+
+
+class WechatSerializer(serializers.ModelSerializer):
+
+    class Meta:
+        model = Wechat
+        fields = ('sms_sign', 'sms_token', 'privacy_statement', )
+
+    def update(self, instance, validated_data):
+        instance = super(WechatSerializer, self).update(instance, validated_data)
+        return instance

+ 10 - 0
apps/wechat/urls.py

@@ -0,0 +1,10 @@
+# coding=utf-8
+
+from django.conf.urls import url
+
+from apps.wechat.views import *
+
+urlpatterns = [
+    url(r'^$', WechatViewSet.as_view()),
+]
+

+ 40 - 0
apps/wechat/views.py

@@ -0,0 +1,40 @@
+# coding=utf-8
+
+from django.db import transaction
+
+from utils.permission import IsAdministratorUser
+from utils.exceptions import CustomError
+from utils import response_ok, response_error
+
+from rest_framework import generics
+
+from apps.log.models import BizLog
+from apps.wechat.models import Wechat
+from apps.wechat.serializers import WechatSerializer
+
+
+class WechatViewSet(generics.RetrieveUpdateAPIView):
+    '''查看修改小程序信息'''
+    permission_classes = [IsAdministratorUser, ]
+    serializer_class = WechatSerializer
+
+    def get_object(self):
+        instance = Wechat.objects.filter().first()
+        if not instance:
+            raise CustomError(u'未添加小程序!')
+        return instance
+
+    def retrieve(self, request, *args, **kwargs):
+        instance = self.get_object()
+        serializer = self.get_serializer(instance)
+        return response_ok(serializer.data)
+
+    def update(self, request, *args, **kwargs):
+        with transaction.atomic():
+            super(WechatViewSet, self).update(request, *args, **kwargs)
+        return response_ok()
+
+    def perform_update(self, serializer):
+        super(WechatViewSet, self).perform_update(serializer)
+        validated_data = serializer.validated_data
+        BizLog.objects.addnew(self.request.user, BizLog.UPDATE, u'修改小程序信息', validated_data)

+ 1 - 0
car_net/settings.py

@@ -45,6 +45,7 @@ INSTALLED_APPS = [
 
     'apps.account',
     'apps.customer',
+    'apps.dashboard',
     'apps.log',
     'apps.vehicle',
     'apps.wechat',

+ 3 - 2
car_net/urls.py

@@ -19,11 +19,12 @@ from django.conf.urls import url, include
 from django.conf.urls.static import static
 from django.conf import settings
 
-from apps.dashboard.views import index, admin_index
+from apps.dashboard.views import index
 
 urlpatterns = [
     url(r'^$', index),
-    url(r'^zzlyadmin/$', admin_index),
+    url(r'^account/', include('apps.account.urls')),
+    url(r'^wechat/', include('apps.wechat.urls')),
     url(r'^customer/', include('apps.customer.urls')),
 ]
 

+ 1 - 1
uis/layuiadmin/lib/view.js

@@ -49,7 +49,7 @@ layui.define(['laytpl', 'layer'], function(exports){
     });
     
     //跳转到登入页
-    parent.location.href = '/tenant/account/login.html';
+    parent.location.href = '/views/account/login.html';
     callback && callback();
   };
   

+ 1 - 1
uis/layuiadmin/modules/common.js

@@ -38,7 +38,7 @@ layui.define(function(exports){
     });
     */
     admin.exit(function(){
-        location.href = '/tenant/account/login.html';
+        location.href = '/views/account/login.html';
       });
   };
 

+ 6 - 11
uis/views/account/login.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>商户管理系统</title>
+  <title>集配美车联网</title>
   <meta name="renderer" content="webkit">
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
@@ -16,17 +16,17 @@
 
     <div class="layadmin-user-login-main">
       <div class="layadmin-user-login-box layadmin-user-login-header">
-        <h2>商户管理系统</h2>
+        <h2>集配美车联网</h2>
       </div>
       <form class="layui-form" action="" lay-filter="component-form-element">
       <div class="layadmin-user-login-box layadmin-user-login-body layui-form">
         <div class="layui-form-item">
           <label class="layadmin-user-login-icon layui-icon layui-icon-username" for="LAY-user-login-username"></label>
-          <input type="text" name="username" id="LAY-user-login-username" placeholder="用户名" autocomplete="off" class="layui-input">
+          <input type="text" name="username" id="LAY-user-login-username" placeholder="用户名" autocomplete="off" class="layui-input" lay-verify="required">
         </div>
         <div class="layui-form-item">
           <label class="layadmin-user-login-icon layui-icon layui-icon-password" for="LAY-user-login-password"></label>
-          <input type="password" name="password" id="LAY-user-login-password" autocomplete="off" placeholder="密码" class="layui-input">
+          <input type="password" name="password" id="LAY-user-login-password" autocomplete="off" placeholder="密码" class="layui-input" lay-verify="required">
         </div>
         <div class="layui-form-item">
           <button class="layui-btn layui-btn-fluid" lay-submit lay-filter="component-form-element">登 录</button>
@@ -57,7 +57,7 @@
 
     if (layui.data(setter.tableName)[setter.request.tokenName]) {
       admin.req({
-        url: '/tenant/token_refresh/'
+        url: '/account/token_refresh/'
         ,data: {token: layui.data(setter.tableName)[setter.request.tokenName].substr(4)}
         ,type: 'post'
         ,done: function(res){
@@ -80,7 +80,7 @@
 
       //请求登入接口
       admin.req({
-        url: '/tenant/login/'
+        url: '/account/login/'
         ,data: obj.field
         ,type: 'post'
         ,done: function(res){
@@ -98,11 +98,6 @@
             key: 'name'
             ,value: res.data.name ? res.data.name: res.data.username
           });
-          layui.data(setter.tableName, {
-            key: 'permissions'
-            ,value: res.data.permissions
-          });
-
           //登入成功的提示与跳转
           layer.msg('登入成功', {
             offset: '15px'

+ 10 - 9
uis/views/account/user_password.html

@@ -16,9 +16,14 @@
         <div class="layui-card-body" pad15>
         <div class="layui-row layui-col-space15">
           <div class="layui-col-md12">
-            <form class="layui-form" action="" lay-filter="component-form-element" id="password_form">
+            <form class="layui-form" action="" lay-filter="component-form-element">
               <div class="layui-row layui-col-space10 layui-form-item">
-
+                <div class="layui-col-lg12">
+                  <label class="layui-form-label">原密码:</label>
+                  <div class="layui-input-block">
+                    <input type="text" name="old_password" lay-verify="required" placeholder="" autocomplete="off" class="layui-input">
+                  </div>
+                </div>
                 <div class="layui-col-lg12">
                   <label class="layui-form-label">新密码:</label>
                   <div class="layui-input-block">
@@ -33,7 +38,7 @@
                 </div>
               <div class="layui-form-item">
                 <div class="layui-input-block">
-                  <button class="layui-btn" lay-submit lay-filter="component-form-element" id="button_save" style="display: none">保存</button>
+                  <button class="layui-btn" lay-submit lay-filter="component-form-element">保存</button>
                 </div>
               </div>
               </div>
@@ -61,13 +66,10 @@
 
     form.on('submit(component-form-element)', function(data){
       admin.req({
-        url: '/admin/user/change_password/'
-        ,data: JSON.stringify(data.field)
+        url: '/account/employee/change_password/'
+        ,data: data.field
         ,type: 'post'
         ,done: function(res){
-            // 清空form
-            $('#password_form')[0].reset();
-            layui.form.render();
             layer.open({
                  type: 1
                 ,content: '<div style="padding: 20px 100px;">保存成功</div>'
@@ -76,7 +78,6 @@
                 ,shade: 0 //不显示遮罩
                 ,yes: function(){
                   layer.closeAll();
-                  parent.layer.closeAll('iframe');
                   admin.exit();
                 }
             });

+ 1 - 1
uis/views/dashboard/index.html → uis/views/home/index.html

@@ -13,7 +13,7 @@
 
 <div class="layui-card" style="height: 100%;display:flex;">
   <div style="margin:auto;font-weight:bold;font-size: 32px;font-style: normal;color:#868686;">
-    欢迎使用商户管理系统
+    欢迎使用集配美车联网管理系统
   </div>
 </div>
 

+ 8 - 101
uis/views/index.html

@@ -2,7 +2,7 @@
 <html>
 <head>
   <meta charset="utf-8">
-  <title>商户管理系统</title>
+  <title>集配美车联网</title>
   <meta name="renderer" content="webkit">
   <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
   <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
@@ -57,7 +57,7 @@
       <div class="layui-side layui-side-menu">
         <div class="layui-side-scroll">
           <div class="layui-logo">
-            <span>商户管理系统</span>
+            <span>集配美车联网</span>
           </div>
 
           <ul class="layui-nav layui-nav-tree" lay-shrink="all" id="LAY-system-side-muen" lay-filter="layadmin-system-side-menu">
@@ -67,78 +67,10 @@
                 <cite>营销作业</cite>
               </a>
               <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="coupon.browse_coupon">
-                  <a lay-href="coupon/index.html">优惠券管理</a>
-                </dd>
                 <dd data-name="nav" data-permission="coupon.browse_coupon_item">
                   <a lay-href="coupon_write_off/index.html">优惠券核销</a>
                 </dd>
               </dl>
-            </li>
-            <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="整车作业" lay-direction="2">
-                <i class="layui-icon layui-icon-set"></i>
-                <cite>整车作业</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="vehicle_order.browse_vehicle_order">
-                  <a lay-href="vehicle_order/index.html">整车预定</a>
-                </dd>
-                <dd data-name="nav" data-permission="recommend.browse_recommend_vehicle">
-                  <a lay-href="vehicle_recommend/index.html">整车推荐</a>
-                </dd>
-              </dl>
-            </li>
-            <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="商品作业" lay-direction="2">
-                <i class="layui-icon layui-icon-set"></i>
-                <cite>商品作业</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="package_order.browse_package_order">
-                  <a lay-href="package_order/index.html">商品购买</a>
-                </dd>
-                <dd data-name="nav" data-permission="recommend.browse_recommend_package">
-                  <a lay-href="package_recommend/index.html">商品推荐</a>
-                </dd>
-              </dl>
-            </li>
-             <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="客户作业" lay-direction="2">
-                <i class="layui-icon layui-icon-set"></i>
-                <cite>客户作业</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="commission_order.browse_commission">
-                  <a lay-href="commission/index.html">佣金管理</a>
-                </dd>
-                 <dd data-name="nav" data-permission="cashout_order.browse_cashout">
-                  <a lay-href="cashout/index.html">提现管理</a>
-                </dd>
-               <dd data-name="nav" data-permission="points_log.browse_points">
-                  <a lay-href="points/index.html">积分管理</a>
-                </dd>
-                 <dd data-name="nav" data-permission="points_order.browse_point_order">
-                  <a lay-href="points_order/index.html">积分兑现</a>
-                </dd>
-                <dd data-name="nav" data-permission="customer.browse_customer">
-                  <a lay-href="customer/index.html">客户管理</a>
-                </dd>
-              </dl>
-            </li>
-              <li data-name="set" class="layui-nav-item">
-              <a href="javascript:;" lay-tips="统计分析" lay-direction="2">
-                <i class="layui-icon layui-icon-set"></i>
-                <cite>统计分析</cite>
-              </a>
-              <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="statistics.browse_page_statistics">
-                  <a lay-href="statistics/page_index.html">页面点击统计</a>
-                </dd>
-              <dd data-name="nav" data-permission="recommend.browse_recommend_commission">
-                  <a lay-href="statistics/commission_index.html">推荐佣金统计</a>
-                </dd>
-              </dl>
             </li>
              <li data-name="set" class="layui-nav-item">
               <a href="javascript:;" lay-tips="基础信息" lay-direction="2">
@@ -146,38 +78,13 @@
                 <cite>系统设置</cite>
               </a>
               <dl class="layui-nav-child">
-                <dd data-name="nav" data-permission="vehicle_model.browse_vehicle_series">
-                  <a lay-href="vehicle_series/index.html">车系管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="vehicle_model.browse_vehicle_model">
-                  <a lay-href="vehicle_model/index.html">车型管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="package.browse_package">
-                  <a lay-href="package/index.html">商品管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="poster.browse_poster">
-                  <a lay-href="poster/index.html">广告管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="shop.browse_shop">
-                  <a lay-href="shop/index.html">门店管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="activity.browse_activity">
-                  <a lay-href="activity/index.html">活动管理</a>
-                </dd>
-                <dd data-name="nav" data-permission="sales_advisor.browse_sales_advisor">
-                  <a lay-href="sale_advisor/index.html">销售顾问</a>
-                </dd>
-                <dd data-name="nav" data-permission="option.browse_option">
-                  <a lay-href="option/index.html">系统选项</a>
-                </dd>
-                 <dd data-name="nav" data-permission="config.browse_config">
-                  <a lay-href="config/index.html">基础设置</a>
-                </dd>
                 <dd data-name="nav" data-permission="employee.browse_employee">
                   <a lay-href="employee/index.html">员工管理</a>
                 </dd>
-                <dd data-name="nav" data-permission="account.browse_group">
-                  <a lay-href="permissions/index.html">权限管理</a>
+              </dl>
+                <dl class="layui-nav-child">
+                <dd data-name="nav" data-permission="employee.browse_employee">
+                  <a lay-href="wechat/index.html">小程序设置</a>
                 </dd>
               </dl>
             </li>
@@ -212,7 +119,7 @@
       <!-- 主体内容 -->
       <div class="layui-body" id="LAY_app_body">
         <div class="layadmin-tabsbody-item layui-show">
-          <iframe src="dashboard/index.html" frameborder="0" class="layadmin-iframe"></iframe>
+          <iframe src="home/index.html" frameborder="0" class="layadmin-iframe"></iframe>
         </div>
       </div>
       
@@ -235,7 +142,7 @@
       var permissions = layui.data(layui.setter.tableName)['permissions'];
       $('#LAY-system-side-muen .layui-nav-child dd').each(function () {
           var perm = $(this).data('permission');
-          if(permissions.indexOf(perm) === -1){
+          if(permissions && permissions.indexOf(perm) === -1){
               $(this).remove();
           }
       });

+ 119 - 0
uis/views/wechat/index.html

@@ -0,0 +1,119 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>系统设置</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+</head>
+<body>
+
+  <div class="layui-fluid">
+    <div class="layui-card">
+        <div class="layui-card-body" pad15>
+        <div class="layui-row layui-col-space15">
+          <div class="layui-col-md12">
+
+              <table class="layui-table">
+                    <tr>
+                        <td class="cell" width="120">隐私声明:</td>
+                        <td class="cell">
+                            <button class="layui-btn" id="btn_privacy_statement">设置</button>
+                        </td>
+                    </tr>
+                </table>
+
+              <form class="layui-form" action="" lay-filter="component-form-element">
+                <table class="layui-table">
+                    <tr>
+                        <td class="cell" width="120">短信SIGN:</td>
+                        <td class="cell">
+                            <input type="text" id="id_sms_sign" name="sms_sign" lay-verify="required" autocomplete="off" class="layui-input">
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="cell">短信TOKEN:</td>
+                        <td class="cell">
+                            <input type="text" id="id_sms_token" name="sms_token" lay-verify="required" autocomplete="off" class="layui-input">
+                        </td>
+                    </tr>
+                    <tr>
+                        <td class="cell"></td>
+                        <td class="cell">
+                            <button class="layui-btn" lay-submit lay-filter="component-form-element">保存设置</button>
+                        </td>
+                    </tr>
+                </table>
+              </form>
+          </div>
+        </div>
+        </div>
+    </div>
+  </div>
+
+  <script src="../../layuiadmin/layui/layui.js?t=1"></script>
+  <script>
+  layui.config({
+    base: '../../../layuiadmin/'
+  }).extend({
+    index: 'lib/index'
+  }).use(['index', 'form'], function(){
+    var $ = layui.$
+    ,form = layui.form
+    ,admin = layui.admin;
+
+    admin.req({
+      url: '/wechat/'
+      ,type: 'get'
+      ,done: function(res){
+        var data = res.data;
+        for (var k in data) {
+            var v = data[k];
+            $('#id_' + k).val(v);
+        }
+        form.render();
+      }
+    });
+
+    form.on('submit(component-form-element)', function(data){
+      admin.req({
+        url: '/wechat/'
+        ,data: data.field
+        ,type: 'put'
+        ,done: function(res){
+            layer.msg('保存成功!', {icon: 6});
+        }
+    });
+
+      return false;
+    });
+
+
+    $('#btn_privacy_statement').on('click', function(){
+        layer.open({
+          type: 2,
+          title: '隐私声明',
+          shadeClose: false,
+          area: ['70%', '95%'],
+          btn: ['保存', '取消'],
+          yes: function (index, dom) {
+            layui.onSubmitChild = function (data) {
+                layer.close(index);
+              };
+              layui.submitChild();
+          },
+          btn2: function(index, layero){
+            layer.close(index);//关闭当前按钮
+          },
+          content: 'privacy_statement.html'
+        });
+    });
+
+  });
+  </script>
+</body>
+</html>
+

+ 89 - 0
uis/views/wechat/privacy_statement.html

@@ -0,0 +1,89 @@
+<!DOCTYPE html>
+<html>
+<head>
+  <meta charset="utf-8">
+  <title>隐私声明</title>
+  <meta name="renderer" content="webkit">
+  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
+  <link rel="stylesheet" href="../../layuiadmin/layui/css/layui.css" media="all">
+  <link rel="stylesheet" href="../../layuiadmin/style/admin.css" media="all">
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/style/formSelects-v4.css"/>
+  <link rel="stylesheet" type="text/css" href="../../layuiadmin/layui/ueditor/themes/default/css/umeditor.css"/>
+    <script type="text/javascript" src="../../layuiadmin/layui/ueditor/third-party/jquery.min.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../layuiadmin/layui/ueditor/umeditor.config.js"></script>
+    <script type="text/javascript" charset="utf-8" src="../../layuiadmin/layui/ueditor/umeditor.js"></script>
+    <script type="text/javascript" src="../../layuiadmin/layui/ueditor/lang/zh-cn/zh-cn.js"></script>
+</head>
+
+<body>
+
+  <div class="layui-fluid">
+        <div class="layui-card">
+
+          <div class="layui-card-body" pad15>
+            <form class="layui-form" action="" lay-filter="component-form-element">
+              <div class="layui-row layui-col-space10 layui-form-item">
+                <div>
+                  <label class="layui-form-label"><font color='red' size="4">*</font>隐私声明:</label>
+                  <div class="layui-input-block">
+                      <script type="text/plain" id="myEditor"></script>
+                  </div>
+                </div>
+                <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element" style="display: none">保存</button>
+              </div>
+            </form>
+          </div>
+        </div>
+  </div>
+
+
+  <script src="../../layuiadmin/layui/layui.js"></script>
+  <script type="text/javascript">
+  layui.config({
+    base: '../../../layuiadmin/' //静态资源所在路径
+  }).extend({
+    index: 'lib/index',
+    formSelects: 'formSelects-v4'
+  }).use(['index', 'form', 'utils', 'upload'], function(){
+    var $ = layui.$
+    ,admin = layui.admin
+    ,upload = layui.upload
+    ,form = layui.form;
+    var um = UM.getEditor('myEditor');
+    um.setWidth('100%');
+    $(".edui-body-container").css("width", "100%");
+    admin.req({
+        url: '/wechat/',
+        type: 'get',
+        done: function (res) {
+            var data = res.data;
+            var edit_data = {};
+            edit_data['privacy_statement'] = data.privacy_statement ? data.privacy_statement : '';
+            um.setContent(edit_data.privacy_statement);
+            form.render();
+        }
+    });
+
+    form.on('submit(component-form-element)', function (data) {
+        var privacy_statement = UM.getEditor('myEditor').getContent();
+        data.field['privacy_statement'] = privacy_statement;
+        var save_data = data.field;
+        admin.req({
+            url: '/wechat/'
+            ,data: save_data
+            ,type: 'put'
+            ,done: function(res){
+                parent.layui.onSubmitChild(res.data);
+            }
+          });
+        return false;
+    });
+
+    parent.layui.submitChild = function () {
+      $("#id_save").click();
+    };
+  });
+  </script>
+</body>
+</html>