| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881 |
- // scripts/clean-dev.ts
- import fs from 'fs/promises'
- import path from 'path'
- // 现代化颜色主题
- const theme = {
- // 基础颜色
- reset: '\x1b[0m',
- bold: '\x1b[1m',
- dim: '\x1b[2m',
- // 前景色
- primary: '\x1b[38;5;75m', // 亮蓝色
- success: '\x1b[38;5;82m', // 亮绿色
- warning: '\x1b[38;5;220m', // 亮黄色
- error: '\x1b[38;5;196m', // 亮红色
- info: '\x1b[38;5;159m', // 青色
- purple: '\x1b[38;5;141m', // 紫色
- orange: '\x1b[38;5;208m', // 橙色
- gray: '\x1b[38;5;245m', // 灰色
- white: '\x1b[38;5;255m', // 白色
- // 背景色
- bgDark: '\x1b[48;5;235m', // 深灰背景
- bgBlue: '\x1b[48;5;24m', // 蓝色背景
- bgGreen: '\x1b[48;5;22m', // 绿色背景
- bgRed: '\x1b[48;5;52m' // 红色背景
- }
- // 现代化图标集
- const icons = {
- rocket: '🚀',
- fire: '🔥',
- star: '⭐',
- gem: '💎',
- crown: '👑',
- magic: '✨',
- warning: '⚠️',
- success: '✅',
- error: '❌',
- info: 'ℹ️',
- folder: '📁',
- file: '📄',
- image: '🖼️',
- code: '💻',
- data: '📊',
- globe: '🌐',
- map: '🗺️',
- chat: '💬',
- bolt: '⚡',
- shield: '🛡️',
- key: '🔑',
- link: '🔗',
- clean: '🧹',
- trash: '🗑️',
- check: '✓',
- cross: '✗',
- arrow: '→',
- loading: '⏳'
- }
- // 格式化工具
- const fmt = {
- title: (text: string) => `${theme.bold}${theme.primary}${text}${theme.reset}`,
- subtitle: (text: string) => `${theme.purple}${text}${theme.reset}`,
- success: (text: string) => `${theme.success}${text}${theme.reset}`,
- error: (text: string) => `${theme.error}${text}${theme.reset}`,
- warning: (text: string) => `${theme.warning}${text}${theme.reset}`,
- info: (text: string) => `${theme.info}${text}${theme.reset}`,
- highlight: (text: string) => `${theme.bold}${theme.white}${text}${theme.reset}`,
- dim: (text: string) => `${theme.dim}${theme.gray}${text}${theme.reset}`,
- orange: (text: string) => `${theme.orange}${text}${theme.reset}`,
- // 带背景的文本
- badge: (text: string, bg: string = theme.bgBlue) =>
- `${bg}${theme.white}${theme.bold} ${text} ${theme.reset}`,
- // 渐变效果模拟
- gradient: (text: string) => {
- const colors = ['\x1b[38;5;75m', '\x1b[38;5;81m', '\x1b[38;5;87m', '\x1b[38;5;159m']
- const chars = text.split('')
- return chars.map((char, i) => `${colors[i % colors.length]}${char}`).join('') + theme.reset
- }
- }
- // 创建现代化标题横幅
- function createModernBanner() {
- console.log()
- console.log(
- fmt.gradient(' ╔══════════════════════════════════════════════════════════════════╗')
- )
- console.log(
- fmt.gradient(' ║ ║')
- )
- console.log(
- ` ║ ${icons.rocket} ${fmt.title('逐趣CRM')} ${fmt.subtitle('· 代码精简程序')} ${icons.magic} ║`
- )
- console.log(
- ` ║ ${fmt.dim('为项目移除演示数据,快速切换至开发模式')} ║`
- )
- console.log(
- fmt.gradient(' ║ ║')
- )
- console.log(
- fmt.gradient(' ╚══════════════════════════════════════════════════════════════════╝')
- )
- console.log()
- }
- // 创建分割线
- function createDivider(char = '─', color = theme.primary) {
- console.log(`${color}${' ' + char.repeat(66)}${theme.reset}`)
- }
- // 创建卡片样式容器
- function createCard(title: string, content: string[]) {
- console.log(` ${fmt.badge('', theme.bgBlue)} ${fmt.title(title)}`)
- console.log()
- content.forEach((line) => {
- console.log(` ${line}`)
- })
- console.log()
- }
- // 进度条动画
- function createProgressBar(current: number, total: number, text: string, width = 40) {
- const percentage = Math.round((current / total) * 100)
- const filled = Math.round((current / total) * width)
- const empty = width - filled
- const filledBar = '█'.repeat(filled)
- const emptyBar = '░'.repeat(empty)
- process.stdout.write(
- `\r ${fmt.info('进度')} [${theme.success}${filledBar}${theme.gray}${emptyBar}${theme.reset}] ${fmt.highlight(percentage + '%')})}`
- )
- if (current === total) {
- console.log()
- }
- }
- // 统计信息
- const stats = {
- deletedFiles: 0,
- deletedPaths: 0,
- failedPaths: 0,
- startTime: Date.now(),
- totalFiles: 0
- }
- // 清理目标
- const targets = [
- 'README.md',
- 'README.zh-CN.md',
- 'src/views/change',
- 'src/views/safeguard',
- 'src/views/article',
- 'src/views/examples',
- 'src/views/system/nested',
- 'src/views/widgets',
- 'src/views/template',
- 'src/views/dashboard/analysis',
- 'src/views/dashboard/ecommerce',
- 'src/mock/json',
- 'src/mock/temp/articleList.ts',
- 'src/mock/temp/commentDetail.ts',
- 'src/mock/temp/commentList.ts',
- 'src/assets/img/cover',
- 'src/assets/img/safeguard',
- 'src/assets/img/3d',
- 'src/components/core/charts/art-map-chart',
- 'src/components/custom/comment-widget'
- ]
- // 递归统计文件数量
- async function countFiles(targetPath: string): Promise<number> {
- const fullPath = path.resolve(process.cwd(), targetPath)
- try {
- const stat = await fs.stat(fullPath)
- if (stat.isFile()) {
- return 1
- } else if (stat.isDirectory()) {
- const entries = await fs.readdir(fullPath)
- let count = 0
- for (const entry of entries) {
- const entryPath = path.join(targetPath, entry)
- count += await countFiles(entryPath)
- }
- return count
- }
- } catch {
- return 0
- }
- return 0
- }
- // 统计所有目标的文件数量
- async function countAllFiles(): Promise<number> {
- let totalCount = 0
- for (const target of targets) {
- const count = await countFiles(target)
- totalCount += count
- }
- return totalCount
- }
- // 删除文件和目录
- async function remove(targetPath: string, index: number) {
- const fullPath = path.resolve(process.cwd(), targetPath)
- createProgressBar(index + 1, targets.length, targetPath)
- try {
- const fileCount = await countFiles(targetPath)
- await fs.rm(fullPath, { recursive: true, force: true })
- stats.deletedFiles += fileCount
- stats.deletedPaths++
- await new Promise((resolve) => setTimeout(resolve, 50))
- } catch (err) {
- stats.failedPaths++
- console.log()
- console.log(` ${icons.error} ${fmt.error('删除失败')}: ${fmt.highlight(targetPath)}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- }
- }
- // 清理异步路由
- async function cleanAsyncRoutes() {
- const asyncRoutesPath = path.resolve(process.cwd(), 'src/router/routes/asyncRoutes.ts')
- try {
- const cleanedRoutes = `import { RoutesAlias } from '../routesAlias'
- import { AppRouteRecord } from '@/types/router'
- /**
- * 菜单列表、异步路由
- *
- * 支持两种模式:
- * 前端静态配置 - 直接使用本文件中定义的路由配置
- * 后端动态配置 - 后端返回菜单数据,前端解析生成路由
- *
- * 菜单标题(title):
- * 可以是 i18n 的 key,也可以是字符串,比如:'用户列表'
- *
- * RoutesAlias.Layout 指向的是布局组件,后端返回的菜单数据中,component 字段需要指向 /index/index
- * 路由元数据(meta):异步路由在 asyncRoutes 中配置,静态路由在 staticRoutes 中配置
- */
- export const asyncRoutes: AppRouteRecord[] = [
- {
- name: 'Dashboard',
- path: '/dashboard',
- component: RoutesAlias.Layout,
- meta: {
- title: 'menus.dashboard.title',
- icon: '',
- roles: ['R_SUPER', 'R_ADMIN']
- },
- children: [
- {
- path: 'console',
- name: 'Console',
- component: RoutesAlias.Dashboard,
- meta: {
- title: 'menus.dashboard.console',
- keepAlive: false,
- fixedTab: true
- }
- }
- ]
- },
- {
- path: '/system',
- name: 'System',
- component: RoutesAlias.Layout,
- meta: {
- title: 'menus.system.title',
- icon: '',
- roles: ['R_SUPER', 'R_ADMIN']
- },
- children: [
- {
- path: 'user',
- name: 'User',
- component: RoutesAlias.User,
- meta: {
- title: 'menus.system.user',
- keepAlive: true,
- roles: ['R_SUPER', 'R_ADMIN']
- }
- },
- {
- path: 'role',
- name: 'Role',
- component: RoutesAlias.Role,
- meta: {
- title: 'menus.system.role',
- keepAlive: true,
- roles: ['R_SUPER']
- }
- },
- {
- path: 'user-center',
- name: 'UserCenter',
- component: RoutesAlias.UserCenter,
- meta: {
- title: 'menus.system.userCenter',
- isHide: true,
- keepAlive: true,
- isHideTab: true
- }
- },
- {
- path: 'menu',
- name: 'Menus',
- component: RoutesAlias.Menu,
- meta: {
- title: 'menus.system.menu',
- keepAlive: true,
- roles: ['R_SUPER'],
- authList: [
- {
- title: '新增',
- authMark: 'add'
- },
- {
- title: '编辑',
- authMark: 'edit'
- },
- {
- title: '删除',
- authMark: 'delete'
- }
- ]
- }
- }
- ]
- },
- {
- path: '/result',
- name: 'Result',
- component: RoutesAlias.Layout,
- meta: {
- title: 'menus.result.title',
- icon: ''
- },
- children: [
- {
- path: 'success',
- name: 'ResultSuccess',
- component: RoutesAlias.Success,
- meta: {
- title: 'menus.result.success',
- keepAlive: true
- }
- },
- {
- path: 'fail',
- name: 'ResultFail',
- component: RoutesAlias.Fail,
- meta: {
- title: 'menus.result.fail',
- keepAlive: true
- }
- }
- ]
- },
- {
- path: '/exception',
- name: 'Exception',
- component: RoutesAlias.Layout,
- meta: {
- title: 'menus.exception.title',
- icon: ''
- },
- children: [
- {
- path: '403',
- name: '403',
- component: RoutesAlias.Exception403,
- meta: {
- title: 'menus.exception.forbidden',
- keepAlive: true
- }
- },
- {
- path: '404',
- name: '404',
- component: RoutesAlias.Exception404,
- meta: {
- title: 'menus.exception.notFound',
- keepAlive: true
- }
- },
- {
- path: '500',
- name: '500',
- component: RoutesAlias.Exception500,
- meta: {
- title: 'menus.exception.serverError',
- keepAlive: true
- }
- }
- ]
- }
- ]
- `
- await fs.writeFile(asyncRoutesPath, cleanedRoutes, 'utf-8')
- console.log(` ${icons.success} ${fmt.success('重写异步路由配置完成')}`)
- } catch (err) {
- console.log(` ${icons.error} ${fmt.error('清理异步路由失败')}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- }
- }
- // 清理路由别名
- async function cleanRoutesAlias() {
- const routesAliasPath = path.resolve(process.cwd(), 'src/router/routesAlias.ts')
- try {
- const cleanedAlias = `/**
- * 路由别名,方便快速找到页面,同时可以用作路由跳转
- */
- export enum RoutesAlias {
- // 布局和认证
- Layout = '/index/index', // 布局容器
- Login = '/auth/login', // 登录
- Register = '/auth/register', // 注册
- ForgetPassword = '/auth/forget-password', // 忘记密码
- // 异常页面
- Exception403 = '/exception/403', // 403
- Exception404 = '/exception/404', // 404
- Exception500 = '/exception/500', // 500
- // 结果页面
- Success = '/result/success', // 成功
- Fail = '/result/fail', // 失败
- // 仪表板
- Dashboard = '/dashboard/console', // 工作台
- // 系统管理
- User = '/system/user', // 账户
- Role = '/system/role', // 角色
- UserCenter = '/system/user-center', // 用户中心
- Menu = '/system/menu' // 菜单
- }
- `
- await fs.writeFile(routesAliasPath, cleanedAlias, 'utf-8')
- console.log(` ${icons.success} ${fmt.success('重写路由别名配置完成')}`)
- } catch (err) {
- console.log(` ${icons.error} ${fmt.error('清理路由别名失败')}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- }
- }
- // 清理变更日志
- async function cleanChangeLog() {
- const changeLogPath = path.resolve(process.cwd(), 'src/mock/upgrade/changeLog.ts')
- try {
- const cleanedChangeLog = `import { ref } from 'vue'
- interface UpgradeLog {
- version: string // 版本号
- title: string // 更新标题
- date: string // 更新日期
- detail?: string[] // 更新内容
- requireReLogin?: boolean // 是否需要重新登录
- remark?: string // 备注
- }
- export const upgradeLogList = ref<UpgradeLog[]>([])
- `
- await fs.writeFile(changeLogPath, cleanedChangeLog, 'utf-8')
- console.log(` ${icons.success} ${fmt.success('清空变更日志数据完成')}`)
- } catch (err) {
- console.log(` ${icons.error} ${fmt.error('清理变更日志失败')}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- }
- }
- // 清理语言文件
- async function cleanLanguageFiles() {
- const languageFiles = [
- { path: 'src/locales/langs/zh.json', name: '中文语言文件' },
- { path: 'src/locales/langs/en.json', name: '英文语言文件' }
- ]
- for (const { path: langPath, name } of languageFiles) {
- try {
- const fullPath = path.resolve(process.cwd(), langPath)
- const content = await fs.readFile(fullPath, 'utf-8')
- const langData = JSON.parse(content)
- const menusToRemove = [
- 'widgets',
- 'template',
- 'article',
- 'examples',
- 'safeguard',
- 'plan',
- 'help'
- ]
- if (langData.menus) {
- menusToRemove.forEach((menuKey) => {
- if (langData.menus[menuKey]) {
- delete langData.menus[menuKey]
- }
- })
- if (langData.menus.dashboard) {
- if (langData.menus.dashboard.analysis) {
- delete langData.menus.dashboard.analysis
- }
- if (langData.menus.dashboard.ecommerce) {
- delete langData.menus.dashboard.ecommerce
- }
- }
- if (langData.menus.system) {
- const systemKeysToRemove = [
- 'nested',
- 'menu1',
- 'menu2',
- 'menu21',
- 'menu3',
- 'menu31',
- 'menu32',
- 'menu321'
- ]
- systemKeysToRemove.forEach((key) => {
- if (langData.menus.system[key]) {
- delete langData.menus.system[key]
- }
- })
- }
- }
- await fs.writeFile(fullPath, JSON.stringify(langData, null, 2), 'utf-8')
- console.log(` ${icons.success} ${fmt.success(`清理${name}完成`)}`)
- } catch (err) {
- console.log(` ${icons.error} ${fmt.error(`清理${name}失败`)}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- }
- }
- }
- // 清理快速入口组件
- async function cleanFastEnterComponent() {
- const fastEnterPath = path.resolve(process.cwd(), 'src/config/fastEnter.ts')
- try {
- const cleanedFastEnter = `/**
- * 快速入口配置
- * 包含:应用列表、快速链接等配置
- */
- import { RoutesAlias } from '@/router/routesAlias'
- import { WEB_LINKS } from '@/utils/constants'
- import type { FastEnterConfig } from '@/types/config'
- const fastEnterConfig: FastEnterConfig = {
- // 显示条件(屏幕宽度)
- minWidth: 1200,
- // 应用列表
- applications: [
- {
- name: '工作台',
- description: '系统概览与数据统计',
- icon: '',
- iconColor: '#377dff',
- path: RoutesAlias.Dashboard,
- enabled: true,
- order: 1
- },
- {
- name: '官方文档',
- description: '使用指南与开发文档',
- icon: '',
- iconColor: '#ffb100',
- path: WEB_LINKS.DOCS,
- enabled: true,
- order: 2
- },
- {
- name: '技术支持',
- description: '技术支持与问题反馈',
- icon: '',
- iconColor: '#ff6b6b',
- path: WEB_LINKS.COMMUNITY,
- enabled: true,
- order: 3
- },
- {
- name: '哔哩哔哩',
- description: '技术分享与交流',
- icon: '',
- iconColor: '#FB7299',
- path: WEB_LINKS.BILIBILI,
- enabled: true,
- order: 4
- }
- ],
- // 快速链接
- quickLinks: [
- {
- name: '登录',
- path: RoutesAlias.Login,
- enabled: true,
- order: 1
- },
- {
- name: '注册',
- path: RoutesAlias.Register,
- enabled: true,
- order: 2
- },
- {
- name: '忘记密码',
- path: RoutesAlias.ForgetPassword,
- enabled: true,
- order: 3
- },
- {
- name: '个人中心',
- path: RoutesAlias.UserCenter,
- enabled: true,
- order: 4
- }
- ]
- }
- export default Object.freeze(fastEnterConfig)
- `
- await fs.writeFile(fastEnterPath, cleanedFastEnter, 'utf-8')
- console.log(` ${icons.success} ${fmt.success('清理快速入口配置完成')}`)
- } catch (err) {
- console.log(` ${icons.error} ${fmt.error('清理快速入口配置失败')}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- }
- }
- // 用户确认函数
- async function getUserConfirmation(): Promise<boolean> {
- const { createInterface } = await import('readline')
- return new Promise((resolve) => {
- const rl = createInterface({
- input: process.stdin,
- output: process.stdout
- })
- console.log(
- ` ${fmt.highlight('请输入')} ${fmt.success('yes')} ${fmt.highlight('确认执行清理操作,或按 Enter 取消')}`
- )
- console.log()
- process.stdout.write(` ${icons.arrow} `)
- rl.question('', (answer: string) => {
- rl.close()
- resolve(answer.toLowerCase().trim() === 'yes')
- })
- })
- }
- // 显示清理警告
- async function showCleanupWarning() {
- createCard('安全警告', [
- `${fmt.warning('此操作将永久删除以下演示内容,且无法恢复!')}`,
- `${fmt.dim('请仔细阅读清理列表,确认后再继续操作')}`
- ])
- const cleanupItems = [
- {
- icon: icons.image,
- name: '图片资源',
- desc: '演示用的封面图片、3D图片、运维图片等',
- color: theme.orange
- },
- {
- icon: icons.file,
- name: '演示页面',
- desc: 'widgets、template、article、examples、safeguard等页面',
- color: theme.purple
- },
- {
- icon: icons.code,
- name: '动态路由文件',
- desc: '重写asyncRoutes.ts,只保留核心路由',
- color: theme.primary
- },
- {
- icon: icons.link,
- name: '路由别名',
- desc: '重写routesAlias.ts,移除演示路由别名',
- color: theme.info
- },
- {
- icon: icons.data,
- name: 'Mock数据',
- desc: '演示用的JSON数据、文章列表、评论数据等',
- color: theme.success
- },
- {
- icon: icons.globe,
- name: '多语言文件',
- desc: '清理中英文语言包中的演示菜单项',
- color: theme.warning
- },
- { icon: icons.map, name: '地图组件', desc: '移除art-map-chart地图组件', color: theme.error },
- { icon: icons.chat, name: '评论组件', desc: '移除comment-widget评论组件', color: theme.orange },
- {
- icon: icons.bolt,
- name: '快速入口',
- desc: '移除分析页、礼花效果、聊天、更新日志、定价、留言管理等无效项目',
- color: theme.purple
- }
- ]
- console.log(` ${fmt.badge('', theme.bgRed)} ${fmt.title('将要清理的内容')}`)
- console.log()
- cleanupItems.forEach((item, index) => {
- console.log(` ${item.color}${theme.reset} ${fmt.highlight(`${index + 1}. ${item.name}`)}`)
- console.log(` ${fmt.dim(item.desc)}`)
- })
- console.log()
- console.log(` ${fmt.badge('', theme.bgGreen)} ${fmt.title('保留的功能模块')}`)
- console.log()
- const preservedModules = [
- { name: 'Dashboard', desc: '工作台页面' },
- { name: 'System', desc: '系统管理模块' },
- { name: 'Result', desc: '结果页面' },
- { name: 'Exception', desc: '异常页面' },
- { name: 'Auth', desc: '登录注册功能' },
- { name: 'Core Components', desc: '核心组件库' }
- ]
- preservedModules.forEach((module) => {
- console.log(` ${icons.check} ${fmt.success(module.name)} ${fmt.dim(`- ${module.desc}`)}`)
- })
- console.log()
- createDivider()
- console.log()
- }
- // 显示统计信息
- async function showStats() {
- const duration = Date.now() - stats.startTime
- const seconds = (duration / 1000).toFixed(2)
- console.log()
- createCard('清理统计', [
- `${fmt.success('成功删除')}: ${fmt.highlight(stats.deletedFiles.toString())} 个文件`,
- `${fmt.info('涉及路径')}: ${fmt.highlight(stats.deletedPaths.toString())} 个目录/文件`,
- ...(stats.failedPaths > 0
- ? [
- `${icons.error} ${fmt.error('删除失败')}: ${fmt.highlight(stats.failedPaths.toString())} 个路径`
- ]
- : []),
- `${fmt.info('耗时')}: ${fmt.highlight(seconds)} 秒`
- ])
- }
- // 创建成功横幅
- function createSuccessBanner() {
- console.log()
- console.log(
- fmt.gradient(' ╔══════════════════════════════════════════════════════════════════╗')
- )
- console.log(
- fmt.gradient(' ║ ║')
- )
- console.log(
- ` ║ ${icons.star} ${fmt.success('清理完成!项目已准备就绪')} ${icons.rocket} ║`
- )
- console.log(
- ` ║ ${fmt.dim('现在可以开始您的开发之旅了!')} ║`
- )
- console.log(
- fmt.gradient(' ║ ║')
- )
- console.log(
- fmt.gradient(' ╚══════════════════════════════════════════════════════════════════╝')
- )
- console.log()
- }
- // 主函数
- async function main() {
- // 清屏并显示横幅
- console.clear()
- createModernBanner()
- // 显示清理警告
- await showCleanupWarning()
- // 统计文件数量
- console.log(` ${fmt.info('正在统计文件数量...')}`)
- stats.totalFiles = await countAllFiles()
- console.log(` ${fmt.info('即将清理')}: ${fmt.highlight(stats.totalFiles.toString())} 个文件`)
- console.log(` ${fmt.dim(`涉及 ${targets.length} 个目录/文件路径`)}`)
- console.log()
- // 用户确认
- const confirmed = await getUserConfirmation()
- if (!confirmed) {
- console.log(` ${fmt.warning('操作已取消,清理中止')}`)
- console.log()
- return
- }
- console.log()
- console.log(` ${icons.check} ${fmt.success('确认成功,开始清理...')}`)
- console.log()
- // 开始清理过程
- console.log(` ${fmt.badge('步骤 1/6', theme.bgBlue)} ${fmt.title('删除演示文件')}`)
- console.log()
- for (let i = 0; i < targets.length; i++) {
- await remove(targets[i], i)
- }
- console.log()
- console.log(` ${fmt.badge('步骤 2/6', theme.bgBlue)} ${fmt.title('重写路由配置')}`)
- console.log()
- await cleanAsyncRoutes()
- console.log()
- console.log(` ${fmt.badge('步骤 3/6', theme.bgBlue)} ${fmt.title('重写路由别名')}`)
- console.log()
- await cleanRoutesAlias()
- console.log()
- console.log(` ${fmt.badge('步骤 4/6', theme.bgBlue)} ${fmt.title('清空变更日志')}`)
- console.log()
- await cleanChangeLog()
- console.log()
- console.log(` ${fmt.badge('步骤 5/6', theme.bgBlue)} ${fmt.title('清理语言文件')}`)
- console.log()
- await cleanLanguageFiles()
- console.log()
- console.log(` ${fmt.badge('步骤 6/6', theme.bgBlue)} ${fmt.title('清理快速入口')}`)
- console.log()
- await cleanFastEnterComponent()
- // 显示统计信息
- await showStats()
- // 显示成功横幅
- createSuccessBanner()
- }
- main().catch((err) => {
- console.log()
- console.log(` ${icons.error} ${fmt.error('清理脚本执行出错')}`)
- console.log(` ${fmt.dim('错误详情: ' + err)}`)
- console.log()
- process.exit(1)
- })
|