4 Commits

17 changed files with 51 additions and 61 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 576 KiB

After

Width:  |  Height:  |  Size: 538 KiB

View File

@@ -102,14 +102,14 @@ tasks.jacocoTestReport {
}
jacoco {
toolVersion = "0.8.12"
toolVersion = "0.8.13"
reportsDirectory.set(layout.buildDirectory.dir("reports/jacoco"))
}
pmd {
sourceSets = listOf(java.sourceSets.findByName("main"))
isConsoleOutput = true
toolVersion = "7.9.0"
toolVersion = "7.15.0"
rulesMinimumPriority.set(5)
ruleSetFiles = files("pmd-rules.xml")
}
@@ -125,7 +125,7 @@ spotless {
}
java {
googleJavaFormat("1.25.2").reflowLongStrings()
googleJavaFormat("1.28.0").reflowLongStrings()
formatAnnotations()
}

View File

@@ -48,11 +48,11 @@ public class LoggingAspect {
return processWithLogging(joinPoint, aopLog);
}
// @Around("execution(* com.zl.mjga.service..*(..))")
// public Object logService(ProceedingJoinPoint joinPoint) throws Throwable {
// AopLog aopLog = new AopLog();
// return processWithLogging(joinPoint, aopLog);
// }
// @Around("execution(* com.zl.mjga.service..*(..))")
// public Object logService(ProceedingJoinPoint joinPoint) throws Throwable {
// AopLog aopLog = new AopLog();
// return processWithLogging(joinPoint, aopLog);
// }
private Object processWithLogging(ProceedingJoinPoint joinPoint, AopLog aopLog) throws Throwable {
if (shouldSkipLogging(joinPoint) || !isUserAuthenticated()) {

View File

@@ -1,8 +1,6 @@
package com.zl.mjga.dto.aoplog;
import java.time.LocalDateTime;
import java.time.OffsetDateTime;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

View File

@@ -47,14 +47,16 @@ public class AopLogRepository extends AopLogDao {
.where(buildConditions(queryDto));
}
public SelectConditionStep<Record> selectByWithoutReturnValue(AopLogQueryDto queryDto) {
return ctx()
.select(AOP_LOG.asterisk().except(AOP_LOG.RETURN_VALUE, AOP_LOG.METHOD_ARGS), USER.USERNAME, DSL.count().over().as("total_count"))
.from(AOP_LOG)
.leftJoin(USER)
.on(AOP_LOG.USER_ID.eq(USER.ID))
.where(buildConditions(queryDto));
.select(
AOP_LOG.asterisk().except(AOP_LOG.RETURN_VALUE, AOP_LOG.METHOD_ARGS),
USER.USERNAME,
DSL.count().over().as("total_count"))
.from(AOP_LOG)
.leftJoin(USER)
.on(AOP_LOG.USER_ID.eq(USER.ID))
.where(buildConditions(queryDto));
}
private Condition buildConditions(AopLogQueryDto queryDto) {

View File

@@ -53,7 +53,7 @@ public class SignE2ETest {
.uri("/auth/sign-up")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(
"""
"""
{
"username": "test_5fab32c22a3e",
"password": "test_eab28b939ba1"
@@ -75,7 +75,7 @@ public class SignE2ETest {
.uri("/auth/sign-in")
.contentType(MediaType.APPLICATION_JSON)
.bodyValue(
"""
"""
{
"username": "test_5fab32c22a3e",
"password": "test_eab28b939ba1"

1
frontend/.gitignore vendored
View File

@@ -18,6 +18,7 @@ coverage
/cypress/screenshots/
# Editor directories and files
.vscode
.vscode/*
!.vscode/extensions.json
.idea

View File

@@ -1,7 +0,0 @@
{
"recommendations": [
"Vue.volar",
"vitest.explorer",
"ms-playwright.playwright"
]
}

View File

@@ -1,18 +0,0 @@
{
"explorer.fileNesting.enabled": true,
"explorer.fileNesting.patterns": {
"tsconfig.json": "tsconfig.*.json, env.d.ts",
"vite.config.*": "jsconfig*, vitest.config.*, cypress.config.*, playwright.config.*",
"package.json": "package-lock.json, pnpm*, .yarnrc*, yarn*, .eslint*, eslint*, .prettier*, prettier*, .editorconfig"
},
"files.associations": {
"*.css": "tailwindcss"
},
"editor.quickSuggestions": {
"strings": "on"
},
"tailwindCSS.classAttributes": ["class", "ui"],
"tailwindCSS.experimental.classRegex": [
["ui:\\s*{([^)]*)\\s*}", "(?:'|\"|`)([^']*)(?:'|\"|`)"]
]
}

View File

@@ -21,7 +21,7 @@
"marked": "^15.0.12",
"openapi-fetch": "^0.13.5",
"pinia": "^3.0.1",
"tailwindcss": "^4.0.14",
"tailwindcss": "^4.1.11",
"vue": "^3.5.13",
"vue-router": "^4.5.0",
"zod": "^3.24.2"
@@ -1832,6 +1832,12 @@
"tailwindcss": "4.1.6"
}
},
"node_modules/@tailwindcss/node/node_modules/tailwindcss": {
"version": "4.1.6",
"resolved": "http://mirrors.tencent.com/npm/tailwindcss/-/tailwindcss-4.1.6.tgz",
"integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==",
"license": "MIT"
},
"node_modules/@tailwindcss/oxide": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.6.tgz",
@@ -2079,6 +2085,12 @@
"vite": "^5.2.0 || ^6"
}
},
"node_modules/@tailwindcss/vite/node_modules/tailwindcss": {
"version": "4.1.6",
"resolved": "http://mirrors.tencent.com/npm/tailwindcss/-/tailwindcss-4.1.6.tgz",
"integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==",
"license": "MIT"
},
"node_modules/@testing-library/dom": {
"version": "10.4.0",
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz",
@@ -3655,7 +3667,7 @@
},
"node_modules/flowbite": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/flowbite/-/flowbite-3.1.2.tgz",
"resolved": "http://mirrors.tencent.com/npm/flowbite/-/flowbite-3.1.2.tgz",
"integrity": "sha512-MkwSgbbybCYgMC+go6Da5idEKUFfMqc/AmSjm/2ZbdmvoKf5frLPq/eIhXc9P+rC8t9boZtUXzHDgt5whZ6A/Q==",
"license": "MIT",
"dependencies": {
@@ -5705,9 +5717,9 @@
}
},
"node_modules/tailwindcss": {
"version": "4.1.6",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz",
"integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==",
"version": "4.1.11",
"resolved": "http://mirrors.tencent.com/npm/tailwindcss/-/tailwindcss-4.1.11.tgz",
"integrity": "sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==",
"license": "MIT"
},
"node_modules/tapable": {

View File

@@ -31,7 +31,7 @@
"marked": "^15.0.12",
"openapi-fetch": "^0.13.5",
"pinia": "^3.0.1",
"tailwindcss": "^4.0.14",
"tailwindcss": "^4.1.11",
"vue": "^3.5.13",
"vue-router": "^4.5.0",
"zod": "^3.24.2"
@@ -59,6 +59,8 @@
"vue-tsc": "^2.2.8"
},
"msw": {
"workerDirectory": ["public"]
"workerDirectory": [
"public"
]
}
}

BIN
frontend/public/mjga.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 MiB

View File

@@ -445,10 +445,7 @@ onMounted(async () => {
if ($userDeleteModalElement) {
userDeleteModal.value = new Modal(
$userDeleteModalElement,
{},
{
id: "user-delete-modal",
},
{}
);
}
const $departmentDeleteModalElement: HTMLElement | null =

View File

@@ -1,10 +1,10 @@
<template>
<div class="flex justify-center items-center my-4">
<a class="group relative w-full sm:w-2/3 md:w-1/2 lg:w-2/5 xl:w-1/3 max-w-xs overflow-hidden rounded-lg border border-gray-200 shadow-lg transition-all duration-300 hover:shadow-xl hover:scale-[1.02]"
<a class="group relative w-full max-w-xs overflow-hidden rounded-lg border border-gray-200 shadow-lg transition-all duration-300 hover:shadow-xl hover:scale-[1.02]"
:href="href" target="_blank">
<div class="absolute top-0 right-0 bg-blue-600 text-white text-xs px-2 py-1 rounded-bl-lg z-10">{{ label }}</div>
<img :src="imageSrc" :alt="imageAlt"
class="w-full h-auto transition-transform duration-500 group-hover:scale-105">
class="w-full h-52 transition-transform duration-500 group-hover:scale-105">
<div
class="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/70 to-transparent p-3 transform transition-all duration-300">
<span class="text-white text-sm font-medium group-hover:underline flex items-center">

View File

@@ -29,7 +29,7 @@
</svg>
<span class="text-sm pl-0.5 pr-2 font-medium">Star</span>
</span>
<span class="text-sm py-0.5 px-2 font-medium">0.2k</span>
<span class="text-sm py-0.5 px-2 font-medium">0.3k</span>
</a>
<button class="cursor-pointer pt-1" @click="changeAssistantVisible">
<AiChatIcon />

View File

@@ -26,7 +26,7 @@
</template>
<script setup lang="ts">
import { Modal, initFlowbite } from "flowbite";
import { initFlowbite } from "flowbite";
import { computed, onMounted } from "vue";
export type ModalSize =
@@ -72,7 +72,6 @@ const maxWidthClass = computed(() => {
return sizes[props.size || "md"];
});
// 确保Flowbite初始化这对于PopupModal的正常工作至关重要
onMounted(() => {
initFlowbite();
});

View File

@@ -1,7 +1,11 @@
<template>
<div class="px-2 sm:px-4 pt-6 sm:rounded-lg">
<PromotionBanner href="https://www.bilibili.com/cheese/play/ss198449120" imageSrc="/ai-tdd.png"
imageAlt="ai-tdd-tutorial" label="官方教程" text="无幻觉式 AI 编程方法论" />
<div class="grid grid-cols-1 sm:grid-cols-2 xl:grid-cols-3 gap-4">
<PromotionBanner href="https://www.bilibili.com/cheese/play/ss198449120" imageSrc="/ai-tdd.png"
imageAlt="ai-tdd-tutorial" label="官方教程" text="无幻觉式 AI 编程方法论" />
<PromotionBanner href="https://www.mjga.cc" imageSrc="/mjga.png" imageAlt="后端脚手架" label="后端脚手架"
text="国内唯一可选配组件和元信息的脚手架" />
</div>
<div class="mb-4">
<Breadcrumbs :names="['用户管理']" />
<h1 class="text-xl font-semibold text-gray-900 sm:text-2xl">用户管理</h1>