Beispiel #1
0
 def put(self, request, group_id):
     # 1. 拿到要修改的分组
     group = Group.objects.filter(id=group_id).first()
     # 1.1 判断是否不存在
     if not group:
         return json_response(errno=Code.NODATA, errmsg='该分组不存在')
     # 2. 拿到前端传递的参数
     put_data = QueryDict(request.body)
     # 3. 校验参数
     # 3.1 创建表单对象
     form = GroupModelForm(put_data, instance=group)
     if form.is_valid():
         # 4. 如果成功,保存数据
         form.save()
         return json_response(errmsg='修改分组成功!')
     else:
         # 拿到所有可用一级菜单
         menus = Menu.objects.only(
             'name', 'permission_id').select_related('permission').filter(
                 is_deleted=False, is_visible=True, parent=None)
         # 拿到当前组的可用权限
         permissions = group.permissions.only('id').all()
         # 渲染包含错误提示的页面
         return render(request,
                       'myadmin/group/group_detail.html',
                       context={
                           'form': form,
                           'menus': menus,
                           'permissions': permissions
                       })
Beispiel #2
0
    def delete(self, request, menu_id):
        menu = Menu.objects.filter(id=menu_id).only('name')  # 没用first方法返回查询集

        if menu:
            menu = menu[0]
            # 验证是否为父菜单
            if menu.children.filter().exists():
                return json_response(errno=Code.DATAERR, errmsg='父菜单不能删除!')
            menu.permission.delete()  # 级联删除,删除了permission,menu也会被删除
            return json_response(errmsg='成功删除菜单%s!' % menu.name)
        else:
            return json_response(errno=Code.NODATA, errmsg='菜单不存在!')
Beispiel #3
0
    def post(self, request):
        # 1. 先校验
        form = LoginForm(request.POST, request=request)
        if form.is_valid():

            return json_response(errmsg='恭喜登录成功')
        else:
            # 将表单的报错信息进行拼接
            error_msg_list = []
            for item in form.errors.values():
                error_msg_list.append(item[0])
            error_msg_str = '/'.join(error_msg_list)
            return json_response(errno=Code.PARAMERR, errmsg=error_msg_str)
Beispiel #4
0
 def get(self, request):
     banners = Banner.objects.values(
         'image_url', 'article__act_num').annotate(
             article_title=F('article__act_name')).filter(
                 is_delete=False)[:constants.SHOW_BANNER_COUNT]
     data = {'banners': list(banners)}
     return json_res.json_response(data=data)
Beispiel #5
0
 def handle_no_permission(self):
     """
     覆盖父类方法,解决ajax返回json数据的问题
     """
     # 没有权限有两种情况
     if self.request.is_ajax():  # 如果请求是ajax
         # 1.登录了,但用户没有权限
         if self.request.user.is_authenticated:
             return json_response(errno=Code.ROLEERR, errmsg='您没有权限!')
         # 2.没有登录
         else:
             return json_response(
                 errno=Code.SESSIONERR,
                 errmsg='您未登录,请登录!',
                 data={'url': reverse(self.get_login_url())})
     else:
         return super().handle_no_permission()
Beispiel #6
0
    def get(self, request):
        banners = Banner.objects.values(
            'image_url',
            'news_id').annotate(news_title=F('news__title')).filter(
                is_deleted=False)[:constants.SHOW_BANNER_COUNT]

        data = {'banners': list(banners)}

        return json_response(data=data)
Beispiel #7
0
 def get(self, request, user_id):
     user = User.objects.filter(id=user_id).first()
     if user:
         form = UserModelForm(
             instance=user)  # 将拿到的user传入django的modelForm对象处理
     else:
         return json_response(errno=Code.NODATA, errmsg='找不到此用户!')
     return render(request,
                   'myadmin/user/user_detail.html',
                   context={'form': form})
Beispiel #8
0
 def put(self, request, news_id):
     # 1. 拿到的要修改的对象
     news = News.objects.filter(id=news_id).first()
     if not news:
         return json_response(errno=Code.NODATA, errmsg='没有此新闻!')
     # 2. 获取put的数据
     put_data = QueryDict(request.body)
     # 3. 创建模型表单
     form = NewsModelForm(put_data, instance=news)
     # 4. 校验表单
     if form.is_valid():
         # 5. 如果成功,则保存数据并返回
         form.save()
         return json_response(errmsg='修改成功!')
     else:
         # 6. 如果失败,返回渲染错误信息的html
         return render(request,
                       'myadmin/news/news_detail.html',
                       context={'form': form})
Beispiel #9
0
    def post(self, request):
        try:
            file = request.FILES['upload']
            filename = get_filename(file.name)

            file_path = os.path.join(settings.MEDIA_ROOT, filename)

            with open(file_path, 'wb') as f:
                for chunk in file.chunks():  # file封装的文件对象
                    f.write(chunk)

            return json_response(
                data={
                    'url': settings.MEDIA_URL + filename,
                    'name': filename,
                    'uploaded': '1'
                })
        except Exception as e:
            logger.error('上传文件失败:[%s]' % e)
            return json_response(data={'uploaded': '0'})
Beispiel #10
0
 def put(self, request, user_id):
     # 1. 拿到要修改的用户对象
     user = User.objects.filter(id=user_id).first()
     # 1.1 判断用户是否存在
     if not user:
         return json_response(errno=Code.NODATA, errmsg='找不到该用户')
     # 2. 拿到前端传递的参数
     put_data = QueryDict(request.body)
     # 3. 校验参数
     # 3.1 创建表单对象
     form = UserModelForm(put_data, instance=user)
     # 4. 如果成功,保存数据
     if form.is_valid():
         form.save()
         return json_response(errmsg='用户修改成功!')
     # 5. 如果不成功,返回渲染了错误提示信息的页面
     else:
         return render(request,
                       'myadmin/user/user_detail.html',
                       context={'form': form})
Beispiel #11
0
 def get(self, request, news_id):
     # 1. 拿到对应的新闻对象
     news = News.objects.filter(id=news_id).first()
     if news:
         # 2. 生成表单对象
         form = NewsModelForm(instance=news)
     else:
         return json_response(errno=Code.NODATA, errmsg='没有此新闻!')
     # 3. 渲染并返回
     return render(request,
                   'myadmin/news/news_detail.html',
                   context={'form': form})
Beispiel #12
0
    def post(self, request):
        # 1. 校验数据
        form = RegisterForm(request.POST)
        if form.is_valid():
            # 创建数据
            username = form.cleaned_data.get('username')
            password = form.cleaned_data.get('password')
            mobile = form.cleaned_data.get('mobile')
            # 创建对象
            # User.objects.create(username=username, password=password, mobile=mobile)    # 这种方法会向数据库存入明文密码
            User.objects.create_user(username=username,
                                     password=password,
                                     mobile=mobile)  # django自带方法,给密码加密
            return json_response(errmsg="恭喜您,注册成功!")

        else:
            # 将表单的报错信息进行拼接
            error_msg_list = []
            for item in form.errors.values():
                error_msg_list.append(item[0])
            error_msg_str = '/'.join(error_msg_list)
            return json_response(errno=Code.PARAMERR, errmsg=error_msg_str)
Beispiel #13
0
 def get(self, request):
     # 1. 拿到所有文档
     docs = Doc.objects.values('file_url', 'file_name', 'title', 'desc',
                               'image_url').filter(is_deleted=False)
     # 2. 分页
     paginator = Paginator(docs, constants.PER_PAGE_DOC_COUNT)
     try:
         page = paginator.get_page(int(request.GET.get('page')))
     except Exception as e:
         page = paginator.get_page(1)
     # 3. 序列化
     data = {'total_page': paginator.num_pages, 'docs': list(page)}
     # 4. 返回json响应
     return json_response(data=data)
Beispiel #14
0
 def put(self, request, **kwargs):
     # 1. 获取模型对象
     self.obj = self.get_obj(**kwargs)
     # 2. 获取参数,创建模型表单对象
     self.form_class = self.get_form_class()
     form = self.form_class(QueryDict(request.body), instance=self.obj)
     # 3. 校验
     if form.is_valid():
         self.save(form)
         return json_response(errmsg='修改数据成功!')
     else:
         return render(request,
                       self.get_template_name(),
                       context=self.get_context_data(form=form))
Beispiel #15
0
    def get(self, request):
        # 1. 判断前端传递标签分类id是否为空,是否为整数,是否超过范围
        # 2. 判断前端传递当前文章页数是否为空,是否为整数,是否超过范围
        try:
            tag_id = int(request.GET.get('tag', 0))
        except Exception as e:
            logger.error('标签错误:\n{}'.format(e))
            tag_id = 0

        try:
            page = int(request.GET.get('page', 1))
        except Exception as e:
            logger.error('页码错误:\n{}'.format(e))
            page = 1
        # 使用only返回的是对象,所以传递到前端时需要迭代处理
        news_queryset = News.objects.select_related('tag', 'author').only(
            'title', 'digest', 'image_url', 'update_time', 'tag__name', 'author__username')
        # values 返回字典
        # news_queryset = News.objects.values('id', 'title', 'digest', 'image_url', 'update_time'). \
        #     annotate(tag_name=F('tag__name'), author=F('author__username'))

        news = news_queryset.filter(is_delete=False, tag_id=tag_id) or \
            news_queryset.filter(is_delete=False)

        paginator = Paginator(news, constants.PER_PAGE_NEWS_COUNT)
        try:
            # 获取页面数据 get_page可以容错
            news_info = paginator.get_page(page)
        except EmptyPage:
            logging.info("用户访问的页数大于总页数")
            news_info = paginator.get_page(paginator.num_pages)
        # 序列化数据
        news_info_list = []
        for n in news_info:
            news_info_list.append({
                'id': n.id,
                'title': n.title,
                'digest': n.digest,
                'image_url': n.image_url,
                'tag_name': n.tag.name,
                'author': n.author.username,
                'update_time': n.update_time.strftime('%Y年%m月%d日 %H:%M')
            })
        data = {
            'total_pages': paginator.num_pages,
            'news': news_info_list
            # 'news': list(news_info)
        }
        return json_response(data=data)
Beispiel #16
0
 def put(self, request, menu_id):
     menu = Menu.objects.filter(id=menu_id).first()
     if not menu:
         return json_response(errno=Code.NODATA, errmsg="菜单不存在!")
     # 获取put请求参数
     put_data = QueryDict(request.body)  # put请求获取数据的方法和post不一样
     form = MenuModelForm(put_data, instance=menu)  # instance传入要修改的对象
     if form.is_valid():
         obj = form.save()
         # 检查修改了的字段是否和权限有关
         flag = False
         if 'name' in form.changed_data:  # form.changed_data:有变动的字段
             obj.permission.name = obj.name  # 修改对应permission中的name字段
             flag = True
         if 'codename' in form.changed_data:
             obj.permission.codename = obj.codename
             flag = True
         if flag:  # 如果有改动,才存储相应对象
             obj.permission.save()
         return json_response(errmsg="菜单修改成功!")
     else:
         return render(request,
                       'myadmin/menu/update_menu.html',
                       context={'form': form})  # 如有异常渲染错误提示页面{% error %}
Beispiel #17
0
 def post(self, request):
     # 1. 接收数据并创建模型表单对象
     form = NewsModelForm(request.POST)
     # 2. 校验
     if form.is_valid():
         # 3. 如果校验通过,保存数据
         instance = form.save(commit=False)  # commit=False 在本地保存,不连接数据库
         # 添加作者字段
         instance.author = request.user
         instance.save()  # 连接数据库
         return json_response(errmsg='添加新闻成功!')
     else:
         # 4. 如果校验失败,就返回包含错误信息的html
         return render(request,
                       'myadmin/news/news_detail.html',
                       context={'form': form})
Beispiel #18
0
    def post(self, request, news_id):
        # 是否登录
        if not request.user.is_authenticated:
            return json_response(errno=Code.SESSIONERR, errmsg=error_map[Code.SESSIONERR])
        # 新闻是否存在
        if not News.objects.only('id').filter(is_delete=False, id=news_id).exists():
            return json_response(errno=Code.PARAMERR, errmsg='新闻不存在!')
        # 获取前端数据
        try:
            json_data = request.body
            if not json_data:
                return json_response(errno=Code.PARAMERR, errmsg="参数为空,请重新输入")
            dict_data = json.loads(json_data.decode('utf8'))
        except Exception as e:
            logger.info("错误信息,\n{}".format(e))
            return json_response(errno=Code.UNKOWNERR, errmsg=error_map[Code.UNKOWNERR])
        content = dict_data.get('content')
        # 内容是否为空
        if not content:
            return json_response(errno=Code.PARAMERR, errmsg='评论内容不能为空!')

        # 父id是否正常
        parent_id = dict_data.get('parent_id')
        if parent_id:
            try:
                # 判断是不是整数
                parent_id = int(parent_id)
                # 判断是否有父评论,父评论id是否与新闻id匹配
                if not Comments.objects.only('id').\
                        filter(is_delete=False, id=parent_id, news_id=news_id).exists():
                    return json_response(errno=Code.PARAMERR, errmsg=error_map[Code.PARAMERR])
            except Exception as e:
                logger.info('前端传递过来的parent_id异常\n{}'.format(e))
                return json_response(errno=Code.PARAMERR, errmsg='未知异常')

        # 保存到数据库
        new_comment = Comments()
        new_comment.content = content
        new_comment.news_id = news_id
        new_comment.author = request.user
        new_comment.parent_id = parent_id if parent_id else None
        new_comment.save()

        return json_response(data=new_comment.to_dict())
Beispiel #19
0
 def post(self, request):
     # 1.根据post的数据,创建表单对象
     form = GroupModelForm(request.POST)
     # 2.校验
     if form.is_valid():
         form.save()
         return json_response(errmsg='添加分组成功!')
     else:
         menus = Menu.objects.only(
             'name', 'permission_id').select_related('permission').filter(
                 is_deleted=False, is_visible=True, parent=None)
         # 2.返回渲染表单
         return render(request,
                       'myadmin/group/group_detail.html',
                       context={
                           'form': form,
                           'menus': menus
                       })
Beispiel #20
0
    def get(self, request):
        # 1. 获取参数
        try:
            tag_id = int(request.GET.get('tag', 0))  # 默认值为0
        except Exception as e:
            logger.error('标签错误: \n{}'.format(e))
            tag_id = 0

        try:
            page = int(request.GET.get('page', 1))  # 默认值为0
        except Exception as e:
            logger.error('页码错误: \n{}'.format(e))
            page = 1

        # 2. 获取查询集
        '''news_queryset = News.objects.values('id', 'title', 'digest', 'image_url', 'update_time', 'tag__name', 'author__username')
        这种写法不方便,因为最终需要返回的字段名为 author而不是tag__name
        '''
        news_queryset = News.objects.values(
            'id', 'title', 'digest', 'image_url',
            'update_time').annotate(tag_name=F('tag__name'),
                                    author=F('author__username'))
        # 过滤
        # if tag_id:
        #     news = news_queryset.filter(is_deleted=False, tag_id=tag_id)
        # else:
        #     news = news_queryset.filter(is_deleted=False)
        news = news_queryset.filter(
            is_deleted=False,
            tag_id=tag_id) or news_queryset.filter(is_deleted=False)

        # 3. 分页
        # 创建分页对象
        paginator = Paginator(news, constants.PER_PAGE_NEWS_COUNT)
        # 获取当前页数据
        current_page = paginator.get_page(page)
        # 4. 返回数据
        data = {
            'total_pages': paginator.num_pages,
            'news': list(current_page),
        }
        return json_response(data=data)
Beispiel #21
0
 def get(self, request):
     # banners = Banner.objects.values('image_url', 'news_id').annotate(
     #     news_title=F('news__title')
     # ).filter(is_delete=False)[:constants.SHOW_BANNER_COUNT]
     banners = Banner.objects.select_related('news').\
                   only('image_url', 'news_id', 'news__title').\
                   filter(is_delete=False)[:constants.SHOW_BANNER_COUNT]
     # 序列化输出
     banners_info_list = []
     for b in banners:
         banners_info_list.append({
             'image_url': b.image_url,
             'news_id': b.news_id,
             'news_title': b.news.title
         })
     # 返回前端
     data = {
         'banners': banners_info_list
     }
     return json_response(data=data)
Beispiel #22
0
 def post(self, request):
     # 1.接收参数并验证
     form = MenuModelForm(request.POST)
     if form.is_valid():
         # 创建菜单
         new_menu = form.save()
         # 菜单的权限对象,菜单的外键
         content_type = ContentType.objects.filter(app_label='myadmin',
                                                   model='menu').first()
         new_permission = Permission.objects.create(
             name=new_menu.name,
             content_type=content_type,
             codename=new_menu.codename)
         new_menu.permission = new_permission
         new_menu.save(update_fields=['permission'])  # 添加update参数可以提高性能
         return json_response(errmsg='添加菜单成功')
     else:
         return render(request,
                       'myadmin/menu/add_menu.html',
                       context={'form': form})
Beispiel #23
0
 def get(self, request, group_id):
     # 1. 拿到要修改的分组
     group = Group.objects.filter(id=group_id).first()
     # 1.1 判断是否存在
     if not group:
         return json_response(errno=Code.NODATA, errmsg='没有此分组!')
     # 2. 创建表单
     form = GroupModelForm(instance=group)
     # 3. 拿到所有可用一级菜单
     menus = Menu.objects.only(
         'name', 'permission_id').select_related('permission').filter(
             is_deleted=False, is_visible=True, parent=None)
     # 4. 拿到当前组的可用权限
     permissions = group.permissions.only('id').all()
     # 5. 返回渲染html
     return render(request,
                   'myadmin/group/group_detail.html',
                   context={
                       'form': form,
                       'menus': menus,
                       'permissions': permissions
                   })
Beispiel #24
0
    def post(self, request, news_id):
        # 是否登录
        if not request.user.is_authenticated:
            return json_response(errno=Code.SESSIONERR,
                                 errmsg=error_map[Code.SESSIONERR])

        # 新闻是否存在
        if not News.objects.filter(is_deleted=False, id=news_id).exists():
            return json_response(errno=Code.PARAMERR, errmsg='新闻新闻不存在')

        # 判断内容
        content = request.POST.get('content')
        if not content:
            return json_response(errno=Code.PARAMERR, errmsg='评论内容不能为空')

        # 父id 是否正常
        parent_id = request.POST.get('parent_id')
        if parent_id:
            try:
                parent_id = int(parent_id)
                if not Comments.objects.filter(is_deleted=False,
                                               id=parent_id,
                                               news_id=news_id).exists():
                    return json_response(errno=Code,
                                         errmsg=error_map[Code.PARAMERR])
            except Exception as e:
                logger.info('前端传递过来的parent_id异常\n{}'.format(e))
                return json_response(errn=Code.PARAMERR, errmsg='未知异常')

        # 保存到数据库
        new_comment = Comments()
        new_comment.content = content
        new_comment.news_id = news_id
        new_comment.author = request.user
        new_comment.parent_id = parent_id if parent_id else None

        new_comment.save()

        # 序列化可放到模型中

        return json_response(data=new_comment.to_dict_data())
Beispiel #25
0
    def post(self, request):
        '''
        1. 校验手机号码
        2. 校验图形验证码
        3. 重新发送验证码时间间隔
        4. 保存短信验证码
        5. 保存发送记录
        :param request:
        :return:
        '''
        # 1.校验手机号
        # mobile = request.POST.get('mobile')
        # 需要先重载form的构造方法 , forms.py
        form = CheckImageForm(request.POST, request=request)

        if form.is_valid():
            # 获取手机号码
            mobile = form.cleaned_data.get('mobile')
            # 生成短信验证码
            sms_code = ''.join([
                random.choice('0123456789')
                for _ in range(constants.SMS_CODE_LENGTH)
            ])
            # 发送短信验证码 调用接口
            logger.info('发送短信验证码正常[mobile: %s sms_code: %s' %
                        (mobile, sms_code))
            # ccp = CCP()
            # try:
            #     res = ccp.send_template_sms(mobile, [sms_code, constants.SMS_CODE_EXPIRES], "1")
            #     if res == 0:
            #         logger.info('发送短信验证码[正常][mobile: %s sms_code: %s]' % (mobile, sms_code))
            #     else:
            #         logger.error('发送短信验证码[失败][mobile: %s sms_code: %s]' % (mobile, sms_code))
            #         return json_response(error=Code.SMSFAIL, errmsg=error_map[Code.SMSFAIL])
            # except Exception as e:
            #     logger.error(('发送短信验证码[异常][mobile: %s message: %s]' % (mobile, e)))
            #     return  json_response(errno=Code.SMSERROR, errmsg=error_map[Code.SMSERROR])

            # 保存发送记录, 不存在session中因为时限不一致(session中所有key值的时限是统一的),应存到redis中
            # 创建短信验证码发送记录的key
            sms_flag_key = 'sms_flag_{}'.format(mobile)
            # 创建短信验证码内容的key
            sms_text_key = 'sms_text_{}'.format(mobile)

            # 创建连接
            redis_conn = get_redis_connection(alias='verify_code')
            # 创建管道
            pl = redis_conn.pipeline()

            try:
                pl.setex(sms_flag_key, constants.SMS_CODE_INTERVAL, 1)
                # 第一个参数:key名,第二个参数:过期时间,第三个参数:对应值
                pl.setex(sms_text_key, constants.SMS_CODE_EXPIRES * 60,
                         sms_code)
                # 让管道通知redis执行命令
                pl.execute()
                return json_response(errmsg='短信发送成功!')
            except Exception as e:
                logger.error('redis 执行异常:{}'.format(e))
                return json_response(errno=Code.UNKOWNERR,
                                     errmsg=error_map[Code.UNKOWNERR])

        else:
            # 将表单的报错信息进行拼接
            error_msg_list = []
            for item in form.errors.values():
                error_msg_list.append(item[0])
            error_msg_str = '/'.join(error_msg_list)
            return json_response(errno=Code.PARAMERR, errmsg=error_msg_str)