浏览代码

轮播管理

wushaodong 4 年之前
父节点
当前提交
536bdd645c

+ 0 - 0
apps/admin/poster/__init__.py


+ 11 - 0
apps/admin/poster/urls.py

@@ -0,0 +1,11 @@
+from rest_framework.routers import SimpleRouter
+from django.conf.urls import url
+from .views import PosterViewSet
+
+urlpatterns = [
+
+]
+
+router = SimpleRouter()
+router.register(r'', PosterViewSet)
+urlpatterns += router.urls

+ 56 - 0
apps/admin/poster/views.py

@@ -0,0 +1,56 @@
+# coding=utf-8
+
+from utils.custom_modelviewset import CustomModelViewSet
+from rest_framework.views import APIView
+from django.db.models import Q
+import traceback
+from rest_framework.decorators import action
+import json
+from apps.tenant.poster.models import Poster
+from utils.permission import IsTenantUser, IsAdministratorUser
+from apps.tenant.poster.serializer import PosterSerializer
+from apps.log.models import BizLog
+from apps.tenant import tenant_log
+from apps.tenant.poster.filters import PosterFilter
+from django.db import transaction
+from utils.exceptions import CustomError
+from utils import response_ok, response_error
+
+
+class PosterViewSet(CustomModelViewSet):
+    permission_classes = [IsAdministratorUser, ]
+    queryset = Poster.objects.filter()
+    serializer_class = PosterSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter()
+        f = PosterFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def create(self, request, *args, **kwargs):
+        data = json.loads(request.POST.get('data'))
+        banner_img = request.FILES.get('banner_img')
+        with transaction.atomic():
+            data['create_user'] = request.user
+            poster = Poster.objects.create(**data)
+            poster._add_img(banner_img)
+            BizLog.objects.addnew(None, request.user, BizLog.INSERT, u'添加轮播信息', data)
+        return response_ok()
+
+    @action(methods=['post'], detail=True)
+    def update_poster(self, request, pk):
+        data = json.loads(request.POST.get('data'))
+        # data = {'title': '644', 'content': '发斯蒂芬44', 'location': '1', 'enable': '1'}
+        banner_img = request.FILES.get('banner_img')
+        try:
+            with transaction.atomic():
+                Poster.objects.filter(id=pk).update(**data)
+                poster = self.get_object()
+                if banner_img:
+                    poster.del_images()
+                    poster._add_img(banner_img)
+        except CustomError as e:
+            return response_error(e.get_error_msg())
+        except Exception as e:
+            return response_error(str(e))
+        return response_ok()

+ 1 - 0
apps/admin/urls.py

@@ -14,4 +14,5 @@ urlpatterns = [
 
     url(r'^tenant/', include('apps.admin.tenant.urls')),
     url(r'^config/', include('apps.admin.config.urls')),
+    url(r'^poster/', include('apps.admin.poster.urls')),
 ]

+ 0 - 0
apps/tenant/poster/__init__.py


+ 11 - 0
apps/tenant/poster/filters.py

@@ -0,0 +1,11 @@
+# coding=utf-8
+
+import django_filters
+from .models import Poster
+
+class PosterFilter(django_filters.FilterSet):
+    title = django_filters.CharFilter(field_name='title', lookup_expr='icontains')
+
+    class Meta:
+        model = Poster
+        fields = '__all__'

+ 0 - 0
apps/tenant/poster/migrations/__init__.py


+ 62 - 0
apps/tenant/poster/models.py

@@ -0,0 +1,62 @@
+from django.db import models
+from utils.exceptions import CustomError
+from PIL import Image
+from django.conf import settings
+from apps.tenant.models import Tenant
+from utils.file_operation import UploadFile, DeleteFile
+
+class Poster(models.Model):
+
+    CAROUSEL =1
+    POPUP = 2
+
+    LOCATION_CHOICES = (
+        (CAROUSEL, u'轮播'),
+        (POPUP, u'弹窗'),
+    )
+
+    title = models.CharField(verbose_name=u'标题', max_length=100)
+    content = models.CharField(verbose_name=u'内容',max_length=500)
+    create_user = models.ForeignKey(settings.AUTH_USER_MODEL, verbose_name=u"创建人", on_delete=models.PROTECT,
+                                    editable=False)
+    create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
+    enable = models.BooleanField(verbose_name=u"在用", default=True)
+    image = models.CharField(verbose_name=u'图片路径', max_length=250)
+    width = models.IntegerField(verbose_name=u"图片宽度")
+    height = models.IntegerField(verbose_name=u"图片高度")
+    location = models.PositiveSmallIntegerField(choices=LOCATION_CHOICES, verbose_name=u"位置")
+    tenant = models.ForeignKey(Tenant, verbose_name=u'租户', editable=False, on_delete=models.PROTECT, null=True)
+
+    class Meta:
+        db_table = 'poster'
+        ordering = ['-id', 'tenant']
+        verbose_name = u'轮播广告'
+
+    def _add_img(self, file):
+        width = None
+        height = None
+
+        path = "poster/"
+        filename = UploadFile(file, path)
+        fullname = "%s%s" % (settings.MEDIA_ROOT, filename)
+
+        try:
+            img = Image.open(fullname)
+            width, height = img.size
+            # 缩略图压缩宽或高最大200
+            if width > 1440:
+                img = img.resize((1440, int((height / width) * 1440)), Image.ANTIALIAS)
+                img.save(fullname)
+                width, height = img.size
+        except:
+            pass
+
+        self.image = "%s%s" % (settings.MEDIA_URL, filename)
+        self.width = width
+        self.height = height
+        self.save()
+
+    def del_images(self):
+        image = self.image
+        # self.delete()
+        DeleteFile(image)

+ 1 - 0
apps/tenant/poster/resources.py

@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-

+ 17 - 0
apps/tenant/poster/serializer.py

@@ -0,0 +1,17 @@
+from rest_framework import serializers
+from .models import Poster
+from django.conf import settings
+
+class PosterSerializer(serializers.ModelSerializer):
+    location_text = serializers.CharField(source='get_location_display', read_only=True)
+    enable_text = serializers.SerializerMethodField()
+    create_user_name = serializers.CharField(source='create_user.employee.name', read_only=True)
+
+    def get_enable_text(self,obj):
+        if obj.enable:
+            return '是'
+        return '否'
+
+    class Meta:
+        model = Poster
+        fields = '__all__'

+ 11 - 0
apps/tenant/poster/urls.py

@@ -0,0 +1,11 @@
+from rest_framework.routers import SimpleRouter
+from django.conf.urls import url
+from .views import PosterViewSet
+
+urlpatterns = [
+
+]
+
+router = SimpleRouter()
+router.register(r'', PosterViewSet)
+urlpatterns += router.urls

+ 50 - 0
apps/tenant/poster/views.py

@@ -0,0 +1,50 @@
+# coding=utf-8
+
+from utils.custom_modelviewset import CustomModelViewSet
+from rest_framework.views import APIView
+from django.db.models import Q
+import traceback
+from .models import Poster
+from utils.permission import IsTenantUser, permission_required
+from .serializer import PosterSerializer
+from apps.log.models import BizLog
+from apps.tenant import tenant_log
+from .filters import PosterFilter
+from django.db import transaction
+from utils.exceptions import CustomError
+from utils import response_ok, response_error
+
+
+class PosterViewSet(CustomModelViewSet):
+    permission_classes = [IsTenantUser, ]
+    queryset = Poster.objects.filter()
+    serializer_class = PosterSerializer
+
+    def filter_queryset(self, queryset):
+        queryset = queryset.filter(area__tenant=self.request.user.employee.tenant)
+        f = PosterFilter(self.request.GET, queryset=queryset)
+        return f.qs
+
+    def perform_create(self, serializer):
+        super(PosterViewSet, self).perform_create(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        tenant_log(self.request.user.employee, BizLog.INSERT, u'添加建筑信息[%s],id=%d' % (instance.building, instance.id),
+                   validated_data)
+
+    def perform_update(self, serializer):
+        super(PosterViewSet, self).perform_update(serializer)
+        instance = serializer.instance
+        validated_data = serializer.validated_data
+        tenant_log(self.request.user.employee, BizLog.UPDATE, u'修改建筑信息[%s],id=%d' % (instance.building, instance.id),
+                   validated_data)
+
+    def destroy(self, request, *args, **kwargs):
+        with transaction.atomic():
+            instance = self.get_object()
+            if instance.area.tenant != request.user.employee.tenant:
+                raise CustomError(u'禁止跨租户操作!')
+            super(PosterViewSet,self).destroy(self, request, *args, **kwargs)
+            tenant_log(self.request.user.employee, BizLog.DELETE, u'删除建筑信息[%s],id=%d' % (instance.building, instance.id))
+        return response_ok()
+

+ 7 - 8
apps/tenant/serializers.py

@@ -6,8 +6,8 @@ from rest_framework import serializers
 from rest_framework_jwt.serializers import JSONWebTokenSerializer
 from rest_framework_jwt.settings import api_settings
 from apps.log.models import BizLog
-from apps.tenant import tenant_log
 from utils import get_remote_addr
+from apps.tenant.employee.models import Employee
 
 User = get_user_model()
 jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
@@ -28,22 +28,21 @@ class TenantJWTSerializer(JSONWebTokenSerializer):
                     msg = u'非工作账号,禁止登录'
                     raise serializers.ValidationError(msg)
 
-                employee = user.employee
+                employee = Employee.objects.filter(user=user).first()
                 if not user.is_active:
                     msg = u'禁用帐户,禁止登录'
-                    tenant_log(employee, BizLog.INSERT,u'禁用帐户[%s]尝试登录系统,IP[%s]' % (user.username, get_remote_addr(self.request)))
+                    BizLog.objects.addnew(employee, user,  BizLog.INSERT,u'禁用帐户[%s]尝试登录系统,IP[%s]' % (user.username, get_remote_addr(self.request)))
                     raise serializers.ValidationError(msg)
 
-                permissions = list(user.get_all_permissions())
-
                 payload = jwt_payload_handler(user)
-                tenant_log(employee, BizLog.INSERT, u'[%s]登录系统,IP[%s]' % (user.username,get_remote_addr(self.request)))
+                BizLog.objects.addnew(employee, 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.employee.name,
-                    'permissions': permissions
+                    'username': user.username,
+                    'user_type': user.type,
                 }
             else:
                 msg = u'账号或者密码错误!'

+ 2 - 2
uis/zzlyadmin/banner/detail.html

@@ -38,13 +38,13 @@
                 <h3>内容:{{ d.content }}</h3>
             </li>
             <li class="tenant-li">
-                <h3>添加人:{{ d.create_user }}</h3>
+                <h3>添加人:{{ d.create_user_name }}</h3>
             </li>
             <li class="tenant-li">
                 <h3>添加时间:{{ d.create_time }}</h3>
             </li>
             <li class="tenant-li">
-                <h3>是否在用:{{ d.usable_text }}</h3>
+                <h3>是否在用:{{ d.enable_text }}</h3>
             </li>
             {{# if(d.image){ }}
             <li class="tenant-li">

+ 72 - 26
uis/zzlyadmin/banner/edit.html

@@ -36,11 +36,21 @@
                                        autocomplete="off" class="layui-input">
                             </div>
                         </div>
-
+                        <div class="layui-col-lg6">
+                            <label class="layui-form-label"><font color='red' size="4">*</font>位置:</label>
+                            <div class="layui-input-block">
+                                <select name="location" lay-verify="required" style="width: 40px;">
+                                    <option value=""></option>
+                                    <option value='1'>轮播</option>
+                                    <option value='2'>弹窗</option>
+                                </select>
+                            </div>
+                        </div>
                         <div class="layui-form-item">
                             <label class="layui-form-label"><font color='red' size="4">*</font>是否在用:</label>
                             <div class="layui-input-block">
-                                <input type="checkbox" name="usable" lay-skin="switch" lay-text="是|否">
+                                <input type="checkbox" name="enable" lay-skin="switch" lay-text="是|否" checked=""
+                                       value="1">
                             </div>
                         </div>
 
@@ -50,7 +60,7 @@
                                 <button type="button" class="layui-btn-sm" id="banner_img">上传图片</button>
                                 <br><br>
                                 <img class="layui-upload-img" id="banner_img_demo" style="max-height: 100px;">
-                        </div>
+                            </div>
                         </div>
 
                         <button class="layui-btn" id="id_save" lay-submit lay-filter="component-form-element"
@@ -76,7 +86,7 @@
         var $ = layui.$
             , laydate = layui.laydate
             , admin = layui.admin
-            ,upload = layui.upload
+            , upload = layui.upload
             , form = layui.form;
         var id = layui.view.getParameterByName('id');
 
@@ -85,24 +95,29 @@
         if (id) {
             var editdata = JSON.parse(JSON.stringify(parent.layui.table.editdata)); // 框架有Bug所以这么转换
             form.val("component-form-element", editdata);
+            $('#banner_img_demo').attr('src', editdata.image);
         }
-        var form_data = [];
+        var form_data = {},
+            url = id ? '/admin/poster/' + id + '/update_poster/' : '/admin/poster/',
+            method = id ? 'post' : 'put',
+            banner_img = '';
+
         upload.render({
             elem: "#banner_img",
-            url: "../../api/upload.json",
+            url: url,
             auto: false,
             field: 'banner_img',
             bindAction: "#upload_image",
-            choose: function(obj) {
+            choose: function (obj) {
                 obj.preview(
-                    function(index, file, result) {
-                      $("#banner_img_demo").attr("src", result)
+                    function (index, file, result) {
+                        $("#banner_img_demo").attr("src", result)
                     }
                 )
             },
             data: {
-                data: function() {
-                  return JSON.stringify(form_data)
+                data: function () {
+                    return JSON.stringify(form_data)
                 }
             },
             done: function (res) {
@@ -116,8 +131,8 @@
                         , btnAlign: 'c' //按钮居中
                         , shade: 0 //不显示遮罩
                         , yes: function () {
-                            layer.closeAll();
-                            //admin.exit();
+                            parent.layer.closeAll('iframe');
+                            parent.layui.table.reload('datagrid', {});
                         }
                     });
                 }
@@ -129,22 +144,53 @@
 
         form.on('submit(component-form-element)', function (data) {
             //layer.msg(JSON.stringify(data.field));
-            var submitData = data.field;
-            // form表单中switch输入数据是on和off
-            if(submitData["usable"] === "on"){
-                submitData["usable"] = true
-            }else{
-                submitData["usable"] = false
+
+            if (!data.field.banner_img) {
+                data.field.banner_img = banner_img
+            } else {
+                banner_img = data.field.banner_img
             }
-            form_data.push({"content": submitData["content"]});
-            form_data.push({"title": submitData["title"]});
-            form_data.push({"usable": submitData["usable"]});
-            if(!data.field.banner_img){
-                layer.msg('请选择轮播图图片');
-            }else{
+            if (!id) {
+                if (!data.field.banner_img) {
+                    layer.msg('请选择轮播图图片');
+                    return false;
+                }
+                form_data = data.field
+                delete form_data.banner_img
                 setTimeout($('#upload_image').click(), 30000)
+            } else {
+                if (data.field.banner_img) { // 修改了图片
+                    form_data = data.field
+                    delete form_data.banner_img
+                    setTimeout($('#upload_image').click(), 30000)
+                } else {
+                    // 没有修改了图片
+                    form_data = data.field
+                    delete form_data.banner_img
+                    admin.req({
+                        url: url
+                        , data: {data:JSON.stringify(form_data)}
+                        , type: method
+                        , done: function (res) {
+                            if (res.code != 0) {
+                                layer.msg(res.msg);
+                            } else {
+                                layer.open({
+                                    type: 1
+                                    , content: '<div style="padding: 20px 100px;">保存成功</div>'
+                                    , btn: '关闭'
+                                    , btnAlign: 'c' //按钮居中
+                                    , shade: 0 //不显示遮罩
+                                    , yes: function () {
+                                        parent.layer.closeAll('iframe');
+                                        parent.layui.table.reload('datagrid', {});
+                                    }
+                                });
+                            }
+                        }
+                    });
+                }
             }
-
             return false;
         });
 

+ 6 - 5
uis/zzlyadmin/banner/index.html

@@ -105,14 +105,15 @@
 
         table.render({
             elem: '#datagrid'
-            , url: '../../api/banner.json'
+            , url: '/admin/poster/'
             , cols: [[
                 {field: 'title', title: '标题', width: 100}
                 ,{field: 'content', title: '内容', width: 100}
-                ,{field: 'create_user', title: '添加人', width: 100}
-                ,{field: 'create_time', title: '添加时间', width: 150}
-                ,{field: 'usable_text', title: '是否在用', width: 100}
-                , {title: "操作", width: 260, align: 'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
+                ,{field: 'location_text', title: '位置', width: 100}
+                ,{field: 'create_user_name', title: '添加人', width: 100}
+                ,{field: 'create_time', title: '添加时间', width: 200}
+                ,{field: 'enable_text', title: '是否在用', width: 100}
+                , {title: "操作", width: 150, align: 'left', fixed: 'right', toolbar: '#datagrid-operate-bar'}
             ]]
             , page: true
             , height: 'full-108'

+ 3 - 4
uis/zzlyadmin/config/index.html

@@ -26,7 +26,7 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">续费年限:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="renew_year_1" lay-verify="required"  class="layui-input"
+                            <input type="text" name="renew_year_1" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">年</div>
@@ -34,15 +34,14 @@
                     <div class="layui-inline">
                         <label class="layui-form-label">金额:</label>
                         <div class="layui-input-inline">
-                            <input type="text" name="renew_amount_1" lay-verify="required"  class="layui-input"
+                            <input type="text" name="renew_amount_1" lay-verify="required" class="layui-input"
                                    placeholder="整数"/>
                         </div>
                         <div class="layui-form-mid ">元</div>
                     </div>
 
                     <div class="layui-input-block">
-                        <button class="layui-btn" lay-submit lay-filter="component-form-element"
-                                data-permission="config.set_config">保存
+                        <button class="layui-btn" lay-submit lay-filter="component-form-element">保存
                         </button>
                         <button class="layui-btn" type="button" id="upload_image" style="display: none"></button>
                     </div>

+ 5 - 5
uis/zzlyadmin/index.html

@@ -74,7 +74,7 @@
                         <dd data-name="nav">
                             <a lay-href="employee/index.html">用户管理</a>
                         </dd>
-                        <dd data-name="nav" data-permission="config.browse_config">
+                        <dd data-name="nav">
                             <a lay-href="config/index.html">基础设置</a>
                         </dd><dd data-name="nav">
                             <a lay-href="banner/index.html">轮播管理</a>
@@ -134,10 +134,10 @@
         if (!name) {
             location.href = '/zzlyadmin/account/login.html'; //没有用户,跳转到登录
         }
-        $('#LAY-system-side-muen .layui-nav-item dl').each(function () {
-            if ($(this).children('dd').length == 0)
-                $(this).parent().remove();
-        });
+        //$('#LAY-system-side-muen .layui-nav-item dl').each(function () {
+        //    if ($(this).children('dd').length == 0)
+       //         $(this).parent().remove();
+       // });
 
     });
 </script>

+ 3 - 3
uis/zzlyadmin/tenant/detail.html

@@ -68,13 +68,13 @@
                         <h3>管理员账号:{{ d.username }}</h3>
                     </li>
                     <li class="tenant-li">
-                        <h3>续费时间:{{ d.renew_time ? || "" }}</h3>
+                        <h3>续费时间:{{ d.renew_time || ''}}</h3>
                     </li>
                     <li class="tenant-li">
-                        <h3>续费金额:{{ d.renew_amount || "" }}</h3>
+                        <h3>续费金额:{{ d.renew_amount || '' }}</h3>
                     </li>
                     <li class="tenant-li">
-                        <h3>拒绝原因:{{ d.reject_reason || "" }}</h3>
+                        <h3>拒绝原因:{{ d.reject_reason  || ''}}</h3>
                     </li>
                     {{# if(d.image){ }}
                     <li class="tenant-li">

+ 3 - 1
utils/file_operation.py

@@ -39,11 +39,13 @@ def DownloadFace(url, save_path, ext):
 
 
 def DeleteFile(filename):
-    img_path = '%s/%s' % (settings.MEDIA_ROOT, filename)
+    img_path = '%s%s' % (settings.UIS_ROOT, filename)
     try:
         if os.path.exists(img_path):
             os.remove(img_path)
     except:
+        import traceback
+        traceback.print_exc()
         pass