基于 Svelte 5 + TypeScript Native + Vite 7 + Tailwind CSS 4 + Bits UI 构建的现代化管理后台框架。
# 推荐使用 pnpm
pnpm install
# 或使用 npm
npm install
pnpm dev
pnpm build
pnpm preview
使用 CLI 工具快速创建完整的 CRUD 模块:
# 运行创建模块命令
pnpm create-module
# 按照提示输入:
# 1. 模块 ID (例如: products)
# 2. 模块名称 (例如: 商品管理)
# 3. 菜单图标 (例如: pi-shopping-bag)
# 4. 路由路径 (例如: /products)
# 5. API 基础路径 (例如: /product)
# 6. 选择父菜单或创建为一级菜单
# 7. 配置表格列、搜索字段、表单字段
完成! 系统自动生成:
src/config/modules/products.config.ts)src/config/menu-structure.config.ts)pnpm remove-module
如果你更喜欢手动配置,只需 2 步:
在 src/config/modules/ 下创建 products.config.ts:
import type { AppModule } from '../app.modules';
const productsModule: AppModule = {
id: 'products',
label: 'menu.products',
icon: 'pi pi-shopping-bag',
path: '/products',
crud: {
title: '商品管理',
apiBase: '/product',
// 表格列
columns: [
{ field: 'id', label: 'ID', width: 80 },
{ field: 'name', label: '商品名称', minWidth: 150 },
{ field: 'price', label: '价格', width: 100, format: 'money' },
{
field: 'status',
label: '状态',
width: 100,
format: 'status',
statusMap: {
1: { label: '上架', color: 'success' },
0: { label: '下架', color: 'danger' },
},
},
],
// 搜索字段
search: [
{ field: 'name', label: '商品名称', type: 'input' },
{
field: 'status',
label: '状态',
type: 'select',
options: [
{ label: '全部', value: '' },
{ label: '上架', value: 1 },
{ label: '下架', value: 0 },
],
},
],
// 表单字段
form: [
{ field: 'name', label: '商品名称', type: 'input', required: true },
{ field: 'price', label: '价格', type: 'number', required: true },
{
field: 'status',
label: '状态',
type: 'select',
defaultValue: 1,
options: [
{ label: '上架', value: 1 },
{ label: '下架', value: 0 },
],
},
],
showAdd: true,
showExport: true,
showSelection: true,
},
};
export default productsModule;
在 src/config/menu-structure.config.ts 中添加:
export const MENU_STRUCTURE: MenuStructure[] = [
// ... 其他配置
// 添加为一级菜单
{ id: 'products' },
// 或添加到现有分组
{
id: 'system',
children: ['logs', 'dict', 'settings', 'products'],
},
];
完成! 刷新页面即可看到新模块。
修改 .env 文件配置应用基本信息:
# 应用标题(浏览器标签页)
VITE_APP_TITLE=管理平台
# 应用简称(侧边栏顶部)
VITE_APP_SHORT_TITLE=管理平台
# 应用描述(登录页)
VITE_APP_DESCRIPTION=后台管理系统
# Logo 图标(PrimeIcons 图标名称)
VITE_APP_LOGO_ICON=pi-briefcase
# 版本号
VITE_APP_VERSION=v1.0.0
# API 基础路径
VITE_API_BASE_URL=/api
# 后端服务地址
VITE_APP_TARGET_URL=http://localhost:3000
# 图片资源 URL 前缀
VITE_IMAGE_BASE_URL=http://localhost:3000
# 开发服务器端口
VITE_PORT=7052
const module: AppModule = {
id: 'users', // 模块唯一标识
label: 'menu.users', // 菜单名称(国际化 key)
icon: 'pi pi-users', // 菜单图标
path: '/users', // 路由路径
hidden: false, // 是否隐藏菜单
// 权限控制
roles: ['admin'], // 允许访问的角色
permissions: ['user:view'], // 允许访问的权限
};
crud: {
title: '用户管理',
apiBase: '/user', // API 基础路径,自动生成 CRUD 接口
// 或自定义 API 路径
api: {
list: '/user/list',
add: '/user/add',
edit: '/user/update',
delete: '/user/delete',
},
// 表格列配置
columns: [
{
field: 'id',
label: 'ID',
width: 80
},
{
field: 'username',
label: '用户名',
minWidth: 120
},
{
field: 'avatar',
label: '头像',
width: 80,
format: 'image', // 图片格式
},
{
field: 'status',
label: '状态',
width: 100,
format: 'status', // 状态标签
statusMap: {
1: { label: '正常', color: 'success' },
0: { label: '禁用', color: 'danger' },
},
},
],
// 搜索字段
search: [
{
field: 'username',
label: '用户名',
type: 'input'
},
{
field: 'status',
label: '状态',
type: 'select',
options: [
{ label: '全部', value: '' },
{ label: '正常', value: 1 },
{ label: '禁用', value: 0 },
],
},
],
// 表单字段
form: [
{
field: 'username',
label: '用户名',
type: 'input',
required: true
},
{
field: 'avatar',
label: '头像',
type: 'image', // 图片上传
required: false
},
{
field: 'images',
label: '相册',
type: 'images', // 多图上传
limit: 9, // 最多 9 张
},
],
// 自定义操作按钮
actions: [
{
label: '查看推荐人',
type: 'primary',
icon: 'pi pi-users',
permission: 'user:referrer', // 操作权限
},
],
// 操作权限配置
actionPermissions: {
add: 'user:add',
edit: 'user:edit',
delete: 'user:delete',
export: 'user:export',
view: 'user:view',
},
showAdd: true, // 显示新增按钮
showExport: true, // 显示导出按钮
showSelection: true, // 显示复选框
}
如果不使用 CRUD 页面,可以指定自定义组件:
const module: AppModule = {
id: 'dashboard',
label: 'menu.dashboard',
icon: 'pi pi-home',
path: '/',
customPage: 'Dashboard', // 使用 src/components/Dashboard.svelte
};
input - 文本输入框select - 下拉选择date - 日期选择dateRange - 日期范围number - 数字输入input - 文本输入框textarea - 多行文本number - 数字输入select - 下拉选择switch - 开关date - 日期选择image - 单图上传images - 多图上传status - 状态标签(需配置 statusMap)image - 图片显示datetime - 日期时间格式化date - 日期格式化money - 金额格式化支持单图和多图上传,带预览、排序功能:
// 单图上传
{
field: 'avatar',
label: '头像',
type: 'image',
maxSize: 5, // 最大 5MB
}
// 多图上传
{
field: 'images',
label: '相册',
type: 'images',
limit: 9, // 最多 9 张
maxSize: 5,
}
import { permissionStore } from '@/stores/permissionStore';
// 登录成功后设置权限
permissionStore.setPermissions([
'user:view',
'user:add',
'user:edit',
'user:delete',
]);
// 设置角色
permissionStore.setRoles(['admin']);
<script lang="ts">
import Permission from '@/components/Permission.svelte';
import { hasPermission } from '@/stores/permissionStore';
</script>
<!-- 权限组件 -->
<Permission permission="user:add">
<button>新增用户</button>
</Permission>
<!-- 在脚本中检查 -->
{#if $hasPermission('user:edit')}
<button>编辑</button>
{/if}
在 src/lib/locales/zh-CN.ts 和 en-US.ts 中添加:
export default {
menu: {
products: '商品管理',
},
products: {
name: '商品名称',
price: '价格',
},
};
<script lang="ts">
import { t } from '$lib/locales';
</script>
<h1>{$t('menu.products')}</h1>
<span>{$t('products.name')}</span>
import { settingsStore } from '@/stores/settingsStore';
// 切换主题
settingsStore.setTheme('dark'); // 'light' | 'dark' | 'system'
// 切换主题色
settingsStore.setPrimaryColor('#409eff');
import { toast } from '@/utils/toast';
toast.success('操作成功');
toast.error('操作失败');
toast.warning('警告信息');
toast.info('提示信息');
import { confirm } from '@/utils/confirm';
const confirmed = await confirm({
title: '删除确认',
content: '确定要删除吗?',
type: 'warning',
});
if (confirmed) {
// 执行删除
}
src/
├── api/ # API 请求
│ ├── request.ts # 请求封装
│ └── upload.ts # 文件上传
├── components/ # 组件
│ ├── CrudPage.svelte # CRUD 页面组件
│ ├── ImageUpload.svelte # 图片上传组件
│ ├── AdminLayout.svelte # 管理布局
│ ├── Sidebar.svelte # 侧边栏
│ ├── Header.svelte # 顶部导航
│ ├── TagsView.svelte # 标签页
│ ├── Login.svelte # 登录页
│ ├── Dashboard.svelte # 仪表盘
│ └── ... # 其他组件
├── config/ # 配置文件
│ ├── index.ts # 应用配置
│ ├── app.modules.ts # 模块自动导入
│ ├── menu-structure.config.ts # 菜单结构
│ ├── module.ts # 模块类型定义
│ └── modules/ # 模块配置目录
│ ├── home.config.ts
│ ├── users.config.ts
│ ├── agents.config.ts
│ └── ...
├── lib/ # 库文件
│ └── locales/ # 国际化
│ ├── index.ts
│ ├── zh-CN.ts
│ └── en-US.ts
├── stores/ # 状态管理
│ ├── authStore.ts # 认证状态
│ ├── routerStore.ts # 路由状态
│ ├── settingsStore.ts # 设置状态
│ └── permissionStore.ts # 权限状态
├── utils/ # 工具函数
│ ├── toast.ts # 消息提示
│ ├── confirm.ts # 确认对话框
│ ├── image.ts # 图片处理
│ └── ...
├── App.svelte # 应用入口
└── main.ts # 主入口
scripts/ # 脚本工具
├── create-module.cjs # 创建模块 CLI
└── remove-module.cjs # 删除模块 CLI
public/ # 静态资源
└── assets/
└── fonts/ # 字体文件
本项目使用了以下优秀的开源项目:
GPL-3.0 License
本项目采用 GNU General Public License v3.0 开源协议,该协议提供:
详见 LICENSE 文件。
zhoolg
如果这个项目对你有帮助,请给个 Star