2023年12月

model

class Video(models.Model):
    view_count = models.IntegerField(verbose_name='浏览量', default=0)
    like_count = models.IntegerField(verbose_name='点赞量', default=0)
    collect_count = models.IntegerField(verbose_name='收藏量', default=0)
    comment_count = models.IntegerField(verbose_name='评论量', default=0)
    # 忽略其他字段

view

from django.db.models import Sum, Count

data = Video.objects.aggregate(
        count=Count('id'),
        view_count=Sum('view_count'),
        like_count=Sum('like_count'),
        collect_count=Sum('collect_count'),
        comment_count=Sum('comment_count')
    )


<template>
  <div >
    日期:
    <el-config-provider :locale="locale">
      <el-date-picker
        v-model="date"
        type="date"
        placeholder="选择日期"
        format="YYYY/MM/DD"
        value-format="YYYY-MM-DD"
      />
    </el-config-provider>
  </div>
</template>
 
<script lang="ts" setup>
import zhCn from "element-plus/lib/locale/lang/zh-cn";
import { ref } from "vue";
const date = ref()
const locale = zhCn,
</script>

获取登录用户有两种方式

1.中间件
2.request.user

1.中间件

from threading import local

_user = local()


class CurrentUserMiddleware:
    def __init__(self, get_response):
        self.get_response = get_response

    def __call__(self, request):
        _user.value = request.user
        response = self.get_response(request)
        return response

    @staticmethod
    def get_current_user():
        return getattr(_user, 'value', None)

setting中

MIDDLEWARE = [
    # ...
    "django.contrib.auth.middleware.AuthenticationMiddleware",
    #...
    #需要在 auth中间件后面
    "backend.middleware.CurrentUserMiddleware",
]

使用

form .middleware import CurrentUserMiddleware

user = CurrentUserMiddleware.get_current_user()

# model中使用
class MyModel(models.Model):
    creator = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name='创建人',
                               related_name='creator', null=True, blank=True, )

    def save(self, *args, **kwargs):
        if not self.pk and not self.author:
            self.author = CurrentUserMiddleware.get_current_user()
        super().save(*args, **kwargs)

2.request

@api_view(["GET"])
@authentication_classes([SessionAuthentication, BasicAuthentication])
@permission_classes([IsAuthenticated])
def tag_create(request):
    user=request.user

class ShareSerializer(serializers.ModelSerializer):
    class Meta:
        model = Share
        # fields = '__all__'
        exclude = ()

    def to_representation(self, instance):
        representation = super().to_representation(instance)
        representation['created_at'] = instance.created_at.strftime("%Y-%m-%d %H:%M:%S")
        representation['updated_at'] = instance.updated_at.strftime("%Y-%m-%d %H:%M:%S")
        return representation

安装依赖

pnpm install --save-dev rollup-plugin-obfuscator javascript-obfuscator

配置

// ...
import obfuscatorBox from 'rollup-plugin-obfuscator';

import {defineConfig} from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite';
import {ArcoResolver} from 'unplugin-vue-components/resolvers';
import obfuscatorBox from 'rollup-plugin-obfuscator';

// https://vitejs.dev/config/
export default defineConfig({
    plugins: [
        //...
        obfuscatorBox({
            global: true,
            options: {
                compact: true,
                controlFlowFlattening: true,
                controlFlowFlatteningThreshold: 0.75,
                numbersToExpressions: true,
                simplify: true,
                stringArrayShuffle: true,
                splitStrings: true,
                splitStringsChunkLength: 10,
                rotateUnicodeArray: true,
                deadCodeInjection: true,
                deadCodeInjectionThreshold: 0.4,
                debugProtection: false,
                debugProtectionInterval: 2000,
                disableConsoleOutput: true,
                domainLock: [],
                identifierNamesGenerator: "hexadecimal",
                identifiersPrefix: "",
                inputFileName: "",
                log: true,
                renameGlobals: true,
                reservedNames: [],
                reservedStrings: [],
                seed: 0,
                selfDefending: true,
                sourceMap: false,
                sourceMapBaseUrl: "",
                sourceMapFileName: "",
                sourceMapMode: "separate",
                stringArray: true,
                stringArrayEncoding: ["base64"],
                stringArrayThreshold: 0.75,
                target: "browser",
                transformObjectKeys: true,
                unicodeEscapeSequence: true,


                domainLockRedirectUrl: "about:blank",
                forceTransformStrings: [],
                identifierNamesCache: null,
                identifiersDictionary: [],
                ignoreImports: true,
                optionsPreset: "default",
                renameProperties: false,
                renamePropertiesMode: "safe",
                sourceMapSourcesMode: "sources-content",

                stringArrayCallsTransform: true,
                stringArrayCallsTransformThreshold: 0.5,

                stringArrayIndexesType: ["hexadecimal-number"],
                stringArrayIndexShift: true,
                stringArrayRotate: true,
                stringArrayWrappersCount: 1,
                stringArrayWrappersChainedCalls: true,
                stringArrayWrappersParametersMaxCount: 2,
                stringArrayWrappersType: "variable",
            },
            apply: 'build' // 仅在生产环境下使用
        }),
    ],
//...
})