mirror of
https://github.com/SECTL/SecScore.git
synced 2026-07-19 12:34:22 +08:00
chore: 新增清理脚本并优化项目配置
1. 新增clean脚本用于清理项目构建产物和缓存 2. 更新.gitignore忽略eslint缓存和src-tauri的target目录 3. 在package.json中添加clean命令 4. 格式化StudentManager组件的回调函数代码
This commit is contained in:
@@ -5,6 +5,7 @@ node_modules/
|
|||||||
dist/
|
dist/
|
||||||
build/
|
build/
|
||||||
target/
|
target/
|
||||||
|
src-tauri/target/
|
||||||
|
|
||||||
# Logs
|
# Logs
|
||||||
*.log
|
*.log
|
||||||
@@ -24,6 +25,9 @@ yarn-error.log*
|
|||||||
*.swo
|
*.swo
|
||||||
*.tmp
|
*.tmp
|
||||||
|
|
||||||
|
# Lint cache
|
||||||
|
.eslintcache
|
||||||
|
|
||||||
# Python
|
# Python
|
||||||
__pycache__/
|
__pycache__/
|
||||||
*.pyc
|
*.pyc
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
"tauri:dev": "node scripts/tauri-dev.cjs",
|
"tauri:dev": "node scripts/tauri-dev.cjs",
|
||||||
"tauri:build": "tauri build",
|
"tauri:build": "tauri build",
|
||||||
"ios:sim": "node scripts/ios-sim.js",
|
"ios:sim": "node scripts/ios-sim.js",
|
||||||
|
"clean": "node scripts/clean.cjs",
|
||||||
"format": "prettier --write .",
|
"format": "prettier --write .",
|
||||||
"lint": "eslint --cache .",
|
"lint": "eslint --cache .",
|
||||||
"lint:fix": "eslint --cache . --fix",
|
"lint:fix": "eslint --cache . --fix",
|
||||||
|
|||||||
@@ -0,0 +1,144 @@
|
|||||||
|
/**
|
||||||
|
* Clean script - Similar to `flutter clean`
|
||||||
|
* Cleans all build artifacts and caches for the Tauri project
|
||||||
|
*/
|
||||||
|
|
||||||
|
const fs = require("fs")
|
||||||
|
const path = require("path")
|
||||||
|
|
||||||
|
// ANSI color codes for console output
|
||||||
|
const colors = {
|
||||||
|
red: "\x1b[31m",
|
||||||
|
green: "\x1b[32m",
|
||||||
|
yellow: "\x1b[33m",
|
||||||
|
blue: "\x1b[34m",
|
||||||
|
reset: "\x1b[0m",
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a directory recursively
|
||||||
|
* @param {string} dirPath - Path to directory to delete
|
||||||
|
*/
|
||||||
|
function deleteDirectory(dirPath) {
|
||||||
|
const fullPath = path.resolve(dirPath)
|
||||||
|
|
||||||
|
if (!fs.existsSync(fullPath)) {
|
||||||
|
console.log(`${colors.yellow}⊘${colors.reset} Not found: ${dirPath}`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.rmSync(fullPath, { recursive: true, force: true })
|
||||||
|
console.log(`${colors.green}✓${colors.reset} Deleted: ${dirPath}`)
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`${colors.red}✗${colors.reset} Failed to delete ${dirPath}: ${error.message}`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a file
|
||||||
|
* @param {string} filePath - Path to file to delete
|
||||||
|
*/
|
||||||
|
function deleteFile(filePath) {
|
||||||
|
const fullPath = path.resolve(filePath)
|
||||||
|
|
||||||
|
if (!fs.existsSync(fullPath)) {
|
||||||
|
console.log(`${colors.yellow}⊘${colors.reset} Not found: ${filePath}`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
fs.unlinkSync(fullPath)
|
||||||
|
console.log(`${colors.green}✓${colors.reset} Deleted: ${filePath}`)
|
||||||
|
return true
|
||||||
|
} catch (error) {
|
||||||
|
console.error(`${colors.red}✗${colors.reset} Failed to delete ${filePath}: ${error.message}`)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main clean function
|
||||||
|
*/
|
||||||
|
function clean() {
|
||||||
|
console.log(`\n${colors.blue}════════════════════════════════════════${colors.reset}`)
|
||||||
|
console.log(`${colors.blue} SecScore Clean - Removing build artifacts${colors.reset}`)
|
||||||
|
console.log(`${colors.blue}════════════════════════════════════════${colors.reset}\n`)
|
||||||
|
|
||||||
|
// Get project root directory
|
||||||
|
const rootDir = path.resolve(__dirname, "..")
|
||||||
|
|
||||||
|
// Directories to clean
|
||||||
|
const dirsToClean = [
|
||||||
|
// Node.js / Frontend
|
||||||
|
"node_modules",
|
||||||
|
"dist",
|
||||||
|
".vite",
|
||||||
|
|
||||||
|
// Rust / Tauri
|
||||||
|
"src-tauri/target",
|
||||||
|
|
||||||
|
// Test coverage
|
||||||
|
"coverage",
|
||||||
|
|
||||||
|
// Cache directories
|
||||||
|
".eslintcache",
|
||||||
|
"node_modules/.cache",
|
||||||
|
]
|
||||||
|
|
||||||
|
// Files to clean
|
||||||
|
const filesToClean = [
|
||||||
|
// Lock files
|
||||||
|
"pnpm-lock.yaml",
|
||||||
|
]
|
||||||
|
|
||||||
|
let deletedCount = 0
|
||||||
|
let failedCount = 0
|
||||||
|
|
||||||
|
// Clean directories
|
||||||
|
console.log(`${colors.blue}Cleaning directories:${colors.reset}`)
|
||||||
|
for (const dir of dirsToClean) {
|
||||||
|
const dirPath = path.join(rootDir, dir)
|
||||||
|
if (deleteDirectory(dirPath)) {
|
||||||
|
deletedCount++
|
||||||
|
} else if (fs.existsSync(dirPath)) {
|
||||||
|
failedCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clean files
|
||||||
|
if (filesToClean.length > 0) {
|
||||||
|
console.log(`\n${colors.blue}Cleaning files:${colors.reset}`)
|
||||||
|
for (const file of filesToClean) {
|
||||||
|
const filePath = path.join(rootDir, file)
|
||||||
|
if (deleteFile(filePath)) {
|
||||||
|
deletedCount++
|
||||||
|
} else if (fs.existsSync(filePath)) {
|
||||||
|
failedCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Summary
|
||||||
|
console.log(`\n${colors.blue}════════════════════════════════════════${colors.reset}`)
|
||||||
|
console.log(`${colors.green}✓ Deleted: ${deletedCount}${colors.reset}`)
|
||||||
|
if (failedCount > 0) {
|
||||||
|
console.log(`${colors.red}✗ Failed: ${failedCount}${colors.reset}`)
|
||||||
|
}
|
||||||
|
console.log(`${colors.blue}════════════════════════════════════════${colors.reset}`)
|
||||||
|
|
||||||
|
if (failedCount > 0) {
|
||||||
|
console.log(
|
||||||
|
`\n${colors.yellow}⚠ Some items could not be deleted. Try closing any running processes and try again.${colors.reset}\n`
|
||||||
|
)
|
||||||
|
process.exit(1)
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n${colors.green}✓ Clean completed successfully!${colors.reset}`)
|
||||||
|
console.log(`${colors.yellow}ℹ Run 'pnpm install' to reinstall dependencies.${colors.reset}\n`)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run clean
|
||||||
|
clean()
|
||||||
@@ -289,7 +289,8 @@ export const StudentManager: React.FC<{ canEdit: boolean }> = ({ canEdit }) => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleDelete = useCallback(async (id: number) => {
|
const handleDelete = useCallback(
|
||||||
|
async (id: number) => {
|
||||||
if (!(window as any).api) return
|
if (!(window as any).api) return
|
||||||
if (!canEdit) {
|
if (!canEdit) {
|
||||||
messageApi.error(t("common.readOnly"))
|
messageApi.error(t("common.readOnly"))
|
||||||
@@ -303,18 +304,24 @@ export const StudentManager: React.FC<{ canEdit: boolean }> = ({ canEdit }) => {
|
|||||||
} else {
|
} else {
|
||||||
messageApi.error(res.message || t("students.deleteFailed"))
|
messageApi.error(res.message || t("students.deleteFailed"))
|
||||||
}
|
}
|
||||||
}, [canEdit, messageApi, t, fetchStudents])
|
},
|
||||||
|
[canEdit, messageApi, t, fetchStudents]
|
||||||
|
)
|
||||||
|
|
||||||
const handleOpenTagEditor = useCallback((student: student) => {
|
const handleOpenTagEditor = useCallback(
|
||||||
|
(student: student) => {
|
||||||
if (!canEdit) {
|
if (!canEdit) {
|
||||||
messageApi.error(t("common.readOnly"))
|
messageApi.error(t("common.readOnly"))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
setEditingStudent(student)
|
setEditingStudent(student)
|
||||||
setTagEditVisible(true)
|
setTagEditVisible(true)
|
||||||
}, [canEdit, messageApi, t])
|
},
|
||||||
|
[canEdit, messageApi, t]
|
||||||
|
)
|
||||||
|
|
||||||
const handleOpenAvatarEditor = useCallback((student: student) => {
|
const handleOpenAvatarEditor = useCallback(
|
||||||
|
(student: student) => {
|
||||||
if (!canEdit) {
|
if (!canEdit) {
|
||||||
messageApi.error(t("common.readOnly"))
|
messageApi.error(t("common.readOnly"))
|
||||||
return
|
return
|
||||||
@@ -322,9 +329,12 @@ export const StudentManager: React.FC<{ canEdit: boolean }> = ({ canEdit }) => {
|
|||||||
setAvatarStudent(student)
|
setAvatarStudent(student)
|
||||||
setAvatarValue(student.avatarUrl || null)
|
setAvatarValue(student.avatarUrl || null)
|
||||||
setAvatarVisible(true)
|
setAvatarVisible(true)
|
||||||
}, [canEdit, messageApi, t])
|
},
|
||||||
|
[canEdit, messageApi, t]
|
||||||
|
)
|
||||||
|
|
||||||
const handleOpenGroupEditor = useCallback((student: student) => {
|
const handleOpenGroupEditor = useCallback(
|
||||||
|
(student: student) => {
|
||||||
if (!canEdit) {
|
if (!canEdit) {
|
||||||
messageApi.error(t("common.readOnly"))
|
messageApi.error(t("common.readOnly"))
|
||||||
return
|
return
|
||||||
@@ -332,7 +342,9 @@ export const StudentManager: React.FC<{ canEdit: boolean }> = ({ canEdit }) => {
|
|||||||
setGroupEditStudent(student)
|
setGroupEditStudent(student)
|
||||||
groupForm.setFieldsValue({ group_name: student.group_name || "" })
|
groupForm.setFieldsValue({ group_name: student.group_name || "" })
|
||||||
setGroupEditVisible(true)
|
setGroupEditVisible(true)
|
||||||
}, [canEdit, messageApi, t, groupForm])
|
},
|
||||||
|
[canEdit, messageApi, t, groupForm]
|
||||||
|
)
|
||||||
|
|
||||||
const handleSaveGroup = async () => {
|
const handleSaveGroup = async () => {
|
||||||
if (!(window as any).api || !groupEditStudent) return
|
if (!(window as any).api || !groupEditStudent) return
|
||||||
|
|||||||
Reference in New Issue
Block a user