基于 Svelte 5 + TypeScript + Vite 7 + Tailwind CSS 4 + Bits UI 构建的管理后台框架。
pnpm install
pnpm dev
pnpm build
# 构建镜像
docker build -t svelte-admin:latest .
# 运行容器
docker run -d -p 8080:80 svelte-admin:latest
# 或使用 docker-compose
docker-compose up -d
# 快速部署
kubectl apply -f k8s/
# 查看部署状态
kubectl get pods -l app=svelte-admin
# 查看服务
kubectl get svc svelte-admin
详细部署文档:DEPLOYMENT.md
只需在 一个文件 中配置所有内容:src/config/app.modules.ts
export const APP_MODULES: AppModule[] = [
// ... 其他配置
// 🎉 添加新模块
{
id: 'products', // 模块 ID
label: '商品管理', // 菜单名称
icon: 'pi pi-shopping-bag', // 图标
path: '/products', // 路由路径
// CRUD 配置
crud: {
title: '商品管理',
apiBase: '/product', // API 基础路径,自动生成所有接口
// 表格列
columns: [
{ field: 'id', label: 'ID', width: 80 },
{ field: 'name', label: '商品名称', minWidth: 150 },
{ field: 'price', label: '价格', width: 100 },
],
// 搜索字段
search: [
{ field: 'name', label: '商品名称', type: 'input' },
],
// 表单字段(新增/编辑)
form: [
{ field: 'name', label: '商品名称', type: 'input', required: true },
{ field: 'price', label: '价格', type: 'number', required: true },
],
// 工具栏
showAdd: true, // 显示新增按钮
showExport: true, // 显示导出按钮
showSelection: true, // 显示复选框
},
},
];
保存刷新,完成! 系统已自动生成:
详细文档:LAZY-MODE.md
修改 .env 文件:
# 应用标题(浏览器标签页)
VITE_APP_TITLE=管理平台
# 应用简称(侧边栏顶部)
VITE_APP_SHORT_TITLE=管理平台
# 应用描述(登录页)
VITE_APP_DESCRIPTION=后台管理系统
# Logo 图标(PrimeIcons 图标名称)
# 图标参考:https://primereact.org/icons/
VITE_APP_LOGO_ICON=pi-briefcase
# 版本号
VITE_APP_VERSION=v1.0.0
# 版权所有者
VITE_APP_COPYRIGHT_OWNER=Your Company
# 开发服务器端口
VITE_PORT=7052
# API 代理目标地址
VITE_API_PROXY_TARGET=https://your-api-server.com
修改 src/config/menu.ts:
export const menuConfig: MenuItem[] = [
// 一级菜单(直接链接)
{
path: '/',
label: '首页',
icon: 'pi pi-home',
},
// 二级菜单(带子菜单)
{
label: '用户中心', // 父菜单名称
icon: 'pi pi-users', // 父菜单图标
// defaultOpen: true, // 是否默认展开(可选)
children: [ // 子菜单数组
{
path: '/users',
label: '用户管理',
icon: 'pi pi-user',
module: 'user', // 模块名称(用于CrudPage)
},
{
path: '/roles',
label: '角色管理',
icon: 'pi pi-shield',
},
],
},
// 隐藏菜单(路由存在但不显示在侧边栏)
{
path: '/profile',
label: '个人中心',
icon: 'pi pi-user',
hidden: true,
},
];
MenuItem 配置项:
| 属性 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 否 | 路由路径(父菜单可不填) |
| label | string | 是 | 菜单名称 |
| icon | string | 是 | PrimeIcons 图标 |
| children | MenuItem[] | 否 | 子菜单数组 |
| hidden | boolean | 否 | 是否隐藏 |
| defaultOpen | boolean | 否 | 是否默认展开 |
| module | string | 否 | 模块名称 |
修改 src/api/config.ts:
// 配置模块基础路径,自动生成 CRUD 接口
export const API_MODULES: Record<string, ModuleApiConfig> = {
// 用户模块
user: {
basePath: '/user', // 基础路径
listPath: '/list', // 列表接口:GET /user/list
addPath: '/add', // 新增接口:POST /user/add
updatePath: '/update', // 修改接口:POST /user/update
deletePath: '/delete', // 删除接口:DELETE /user/delete/:id
detailPath: '/detail', // 详情接口:GET /user/detail/:id
},
// 自定义请求方法
order: {
basePath: '/order',
listPath: '/list',
deleteMethod: 'POST', // 删除使用 POST 方法
},
};
使用方式:
import { createModuleApi } from '@/api';
const userApi = createModuleApi('user');
// 获取列表
userApi.list({ page: 1, pageSize: 10 });
// 新增
userApi.add({ name: 'test', phone: '13800138000' });
// 修改
userApi.update({ id: 1, name: 'test2' });
// 删除
userApi.delete(1);
// 详情
userApi.detail(1);
export const CUSTOM_API = {
auth: {
login: { url: '/auth/login', method: 'POST', desc: '登录' },
logout: { url: '/auth/logout', method: 'POST', desc: '退出' },
},
upload: {
image: { url: '/upload/image', method: 'POST', desc: '上传图片' },
},
};
使用 CrudPage 组件自动生成 CRUD 页面:
<!-- src/pages/Users.svelte -->
<script lang="ts">
import CrudPage from '@/components/CrudPage.svelte';
import { defineModule } from '@/config/module';
const config = defineModule({
name: 'user',
title: '用户管理',
// API 配置
api: {
list: '/user/list',
add: '/user/add',
edit: '/user/update',
delete: '/user/delete',
},
// 表格配置
table: {
rowKey: 'id',
showSelection: true, // 显示选择框
showIndex: false, // 显示序号
actionWidth: 150, // 操作列宽度
columns: [
{ field: 'id', label: 'ID', width: 80 },
{ field: 'username', label: '用户名', width: 120 },
{ field: 'phone', label: '手机号', width: 130 },
{
field: 'status',
label: '状态',
width: 100,
format: 'status',
statusMap: {
1: { label: '正常', color: 'success' },
0: { label: '禁用', color: 'danger' },
},
},
{ field: 'createTime', label: '创建时间', width: 180 },
],
actions: [
{ label: '编辑', type: 'primary' },
{ label: '删除', type: 'danger', confirm: '确定删除?' },
],
},
// 搜索配置
search: {
fields: [
{ field: 'username', label: '用户名', type: 'input', placeholder: '请输入' },
{ field: 'phone', label: '手机号', type: 'input' },
{
field: 'status',
label: '状态',
type: 'select',
options: [
{ label: '全部', value: '' },
{ label: '正常', value: 1 },
{ label: '禁用', value: 0 },
],
},
],
},
// 表单配置(新增/编辑)
form: {
width: 500,
fields: [
{ field: 'username', label: '用户名', type: 'input', required: true },
{ field: 'phone', label: '手机号', type: 'input' },
{ field: 'email', label: '邮箱', type: 'input' },
{
field: 'status',
label: '状态',
type: 'select',
defaultValue: 1,
options: [
{ label: '正常', value: 1 },
{ label: '禁用', value: 0 },
],
},
],
},
// 工具栏配置
toolbar: {
showAdd: true,
addText: '新增用户',
showExport: true,
showRefresh: true,
},
});
</script>
<CrudPage {config} />
本框架支持零代码自动生成完整的增删改查页面,只需配置菜单和模块即可。
菜单配置 (menu.ts) + 模块配置 (modules/xxx/config.ts)
↓
自动生成路由
↓
自动渲染 CrudPage
↓
完整的增删改查页面(列表、搜索、新增、编辑、删除)
在 src/config/menu.ts 中添加菜单项,设置 module 属性:
// src/config/menu.ts
export const menuConfig: MenuItem[] = [
// ... 其他菜单
{
label: '订单中心',
icon: 'pi pi-shopping-cart',
children: [
{
path: '/orders',
label: '订单管理',
icon: 'pi pi-list',
module: 'order', // 关键:指定模块名称
},
],
},
];
创建 src/modules/order/config.ts:
// src/modules/order/config.ts
import { defineModule } from '../../config/module';
import type { ModuleConfig } from '../../config/module';
export interface Order {
id: number;
orderNo: string;
customerName: string;
amount: number;
status: number;
createTime: string;
}
export default defineModule<Order>({
name: 'order',
title: '订单管理',
// API 接口配置
api: {
list: '/order/list', // 列表接口
add: '/order/add', // 新增接口
edit: '/order/update', // 编辑接口
delete: '/order/delete', // 删除接口
},
// 表格配置
table: {
rowKey: 'id',
showSelection: true, // 显示复选框
columns: [
{ field: 'id', label: 'ID', width: 80 },
{ field: 'orderNo', label: '订单号', minWidth: 150 },
{ field: 'customerName', label: '客户名称', minWidth: 120 },
{ field: 'amount', label: '金额', width: 100 },
{
field: 'status',
label: '状态',
width: 100,
format: 'status',
statusMap: {
0: { label: '待付款', color: 'warning' },
1: { label: '已付款', color: 'success' },
2: { label: '已取消', color: 'danger' },
},
},
{ field: 'createTime', label: '创建时间', minWidth: 180 },
],
actions: [
{ label: '编辑', type: 'primary', icon: 'pi pi-pencil' },
{ label: '删除', type: 'danger', icon: 'pi pi-trash', confirm: '确定删除该订单吗?' },
],
},
// 搜索表单配置
search: {
fields: [
{ field: 'orderNo', label: '订单号', type: 'input', placeholder: '请输入订单号' },
{ field: 'customerName', label: '客户名称', type: 'input', placeholder: '请输入客户名称' },
{
field: 'status',
label: '状态',
type: 'select',
options: [
{ label: '待付款', value: 0 },
{ label: '已付款', value: 1 },
{ label: '已取消', value: 2 },
],
},
],
},
// 新增/编辑表单配置
form: {
width: 500,
fields: [
{ field: 'orderNo', label: '订单号', type: 'input', required: true },
{ field: 'customerName', label: '客户名称', type: 'input', required: true },
{ field: 'amount', label: '金额', type: 'number', required: true },
{
field: 'status',
label: '状态',
type: 'select',
defaultValue: 0,
options: [
{ label: '待付款', value: 0 },
{ label: '已付款', value: 1 },
{ label: '已取消', value: 2 },
],
},
],
},
// 工具栏配置
toolbar: {
showAdd: true,
addText: '新增订单',
showExport: true,
showRefresh: true,
},
}) as ModuleConfig<Order>;
在 src/modules/index.ts 中注册:
// src/modules/index.ts
import orderConfig from './order/config';
export const moduleConfigs: Record<string, ModuleConfig> = {
// ... 其他模块
order: orderConfig,
};
export { orderConfig };
完成! 无需创建页面文件,无需配置路由,系统自动生成完整的增删改查页面。
| 功能 | 说明 |
|---|---|
| 列表查询 | 分页查询、自动渲染表格 |
| 搜索 | 根据配置自动生成搜索表单 |
| 新增 | 弹窗表单、字段验证、提交 |
| 编辑 | 自动填充数据、更新提交 |
| 删除 | 单条删除、批量删除、确认提示 |
| 导出 | CSV/Excel 导出 |
| 状态标签 | 自动渲染状态标签 |
{
field: 'status', // 字段名
label: '状态', // 列标题
width: 100, // 列宽度
minWidth: 80, // 最小宽度
align: 'center', // 对齐方式: left | center | right
sortable: true, // 是否可排序
format: 'status', // 格式化: status | datetime | date | money
statusMap: { // 状态映射(format 为 status 时)
1: { label: '正常', color: 'success' },
0: { label: '禁用', color: 'danger' },
},
// 自定义渲染函数(可选)
render: (value, row) => value,
}
{
field: 'status', // 字段名
label: '状态', // 标签
type: 'select', // 类型: input | select | date | dateRange | number
placeholder: '请选择', // 占位符
options: [...], // 选项(select 类型)
defaultValue: '', // 默认值
}
{
field: 'username', // 字段名
label: '用户名', // 标签
type: 'input', // 类型: input | textarea | select | number | date | switch
required: true, // 是否必填
placeholder: '请输入', // 占位符
defaultValue: '', // 默认值
disabled: false, // 是否禁用
maxLength: 50, // 最大长度
rows: 3, // 行数(textarea)
tip: '提示信息', // 提示文字
options: [...], // 选项(select 类型)
}
{
label: '编辑', // 按钮文字
type: 'primary', // 类型: primary | success | warning | danger
icon: 'pi pi-pencil', // 图标
confirm: '确定删除?', // 确认提示(有值则显示确认框)
show: (row) => row.status === 0, // 是否显示(函数或布尔值)
}
注意: 如果使用了
module属性,路由会自动生成,无需手动配置。只有自定义页面(不使用 CrudPage)才需要手动配置路由。
手动配置路由(自定义页面):
// src/router/index.ts 的 customPages 中添加
import Dashboard from '../pages/Dashboard.svelte';
import Profile from '../pages/Profile.svelte';
import Settings from '../pages/Settings.svelte';
import YourCustomPage from '../pages/YourCustomPage.svelte';
const customPages: Record<string, any> = {
'/': Dashboard,
'/profile': Profile,
'/settings': Settings,
'/your-custom-page': YourCustomPage, // 添加自定义页面
};
import { usePermissionStore } from '@/store/usePermissionStore';
// 登录成功后设置权限
const { setPermissions } = usePermissionStore();
setPermissions([
'user:view',
'user:add',
'user:edit',
'user:delete',
'order:view',
// '*' 表示超级管理员
]);
<script lang="ts">
import Permission from '@/components/Permission.svelte';
</script>
<!-- 单个权限 -->
<Permission permission="user:add">
<button>新增用户</button>
</Permission>
<!-- 多个权限(任一) -->
<Permission permission={['user:add', 'user:edit']} mode="any">
<button>操作</button>
</Permission>
<!-- 多个权限(全部) -->
<Permission permission={['user:add', 'user:edit']} mode="all">
<button>操作</button>
</Permission>
import { usePermission } from '@/store/usePermissionStore';
const { hasPermission, hasRole } = usePermission();
if (hasPermission('user:add')) {
// 有权限
}
修改 src/locales/zh-CN.ts 和 src/locales/en-US.ts:
export default {
common: {
confirm: '确定',
cancel: '取消',
// ...
},
yourModule: {
title: '你的模块',
// ...
},
};
<script lang="ts">
import { useLocale } from '@/locales';
const { t, locale, setLocale } = useLocale();
</script>
<!-- 获取翻译 -->
<span>{$t('common.confirm')}</span>
<!-- 带变量 -->
<span>{$t('table.total', { total: 100 })}</span>
<!-- 切换语言 -->
<button onclick={() => setLocale('en-US')}>切换到英文</button>
import { useSettingsStore } from '@/store/useSettingsStore';
const { theme, setTheme, primaryColor, setPrimaryColor } = useSettingsStore();
// 切换主题
setTheme('dark'); // 'light' | 'dark' | 'system'
// 切换主题色
setPrimaryColor('#409eff');
src/
├── api/ # API 配置和请求
│ ├── config.ts # API 模块配置
│ ├── index.ts # API 导出
│ ├── request.ts # 请求封装
│ └── types.ts # 类型定义
├── components/ # 通用组件
│ ├── CrudPage/ # CRUD 页面组件
│ ├── Table/ # 增强表格
│ ├── Charts/ # 图表组件
│ ├── Captcha/ # 验证码
│ ├── TagsView/ # 标签页
│ ├── Toast.tsx # 消息提示
│ └── Modal.tsx # 弹窗
├── config/ # 配置文件
│ ├── index.ts # 配置导出
│ ├── menu.ts # 菜单配置
│ └── module.ts # 模块类型定义
├── layouts/ # 布局组件
│ ├── AdminLayout.svelte # 管理后台布局
│ ├── Sidebar.svelte # 侧边栏
│ └── Header.svelte # 顶部导航
├── locales/ # 国际化
│ ├── index.ts # 国际化配置
│ ├── zh-CN.ts # 中文
│ └── en-US.ts # 英文
├── pages/ # 页面组件
├── store/ # 状态管理
│ ├── useAuthStore.ts # 认证状态
│ ├── useSettingsStore.ts # 设置状态
│ └── usePermissionStore.ts # 权限状态
├── hooks/ # 自定义 Hooks
├── utils/ # 工具函数
├── App.tsx # 应用入口
└── main.tsx # 主入口
<script lang="ts">
import LineChart from '@/components/Charts/LineChart.svelte';
import BarChart from '@/components/Charts/BarChart.svelte';
import PieChart from '@/components/Charts/PieChart.svelte';
import ProgressBar from '@/components/Charts/ProgressBar.svelte';
import CircleProgress from '@/components/Charts/CircleProgress.svelte';
import StatCard from '@/components/Charts/StatCard.svelte';
const data = [{ label: '周一', value: 100 }, { label: '周二', value: 200 }];
</script>
<!-- 折线图 -->
<LineChart {data} showArea smooth />
<!-- 柱状图 -->
<BarChart {data} showValue />
<!-- 饼图 -->
<PieChart {data} innerRadius={0.6} showLegend />
<!-- 进度条 -->
<ProgressBar value={75} color="#409eff" />
<!-- 环形进度 -->
<CircleProgress value={75} size={100} />
<!-- 统计卡片 -->
<StatCard
title="用户数"
value="1,234"
icon="pi-users"
trend={{ value: 12, isUp: true }}
/>
<script lang="ts">
import { toast } from '@/components/Toast';
function handleSuccess() {
toast.success('操作成功');
}
function handleError() {
toast.error('操作失败');
}
function handleWarning() {
toast.warning('警告信息');
}
function handleInfo() {
toast.info('提示信息');
}
</script>
<script lang="ts">
import { confirm } from '@/components/Modal';
async function handleDelete() {
const confirmed = await confirm({
title: '删除确认',
content: '确定要删除吗?',
type: 'warning',
});
if (confirmed) {
// 执行删除
}
}
</script>
使用超级懒人模式,只需 3 步:
.env 文件(应用名称、Logo、API地址)src/config/app.modules.ts 添加模块配置传统方式需要 7 步,现在只需 3 步!
.env 文件(应用名称、Logo、API地址)src/config/menu.ts(菜单配置)src/api/config.ts(API配置)src/App.tsx)本项目提供完整的 Docker 支持,使用多阶段构建优化镜像体积。
# 使用 docker-compose 快速启动
docker-compose up -d
# 访问应用
open http://localhost:8080
# 构建镜像
docker build -t your-registry/svelte-admin:v1.0.0 .
# 推送到镜像仓库
docker push your-registry/svelte-admin:v1.0.0
# 运行容器
docker run -d \
-p 80:80 \
--name svelte-admin \
your-registry/svelte-admin:v1.0.0
提供完整的 K8s 部署配置,支持生产级部署。
# 1. 修改配置
# 编辑 k8s/configmap.yaml 和 k8s/deployment.yaml
# 2. 部署到集群
kubectl apply -f k8s/
# 3. 查看状态
kubectl get pods -l app=svelte-admin
kubectl get svc svelte-admin
kubectl get ingress svelte-admin
# 构建并推送镜像
make build push
# 部署到 K8s
make deploy
# 查看状态
make status
# 查看日志
make logs
# 扩容到 5 个副本
make scale REPLICAS=5
┌─────────────────────────────────────────────┐
│ Ingress Controller │
│ (HTTPS, 域名路由, 负载均衡) │
└─────────────────┬───────────────────────────┘
│
┌─────────────────▼───────────────────────────┐
│ Service (ClusterIP) │
│ (内部负载均衡, 服务发现) │
└─────────────────┬───────────────────────────┘
│
┌─────────┼─────────┐
│ │ │
┌───────▼──┐ ┌───▼─────┐ ┌─▼────────┐
│ Pod 1 │ │ Pod 2 │ │ Pod 3 │
│ Nginx │ │ Nginx │ │ Nginx │
│ + App │ │ + App │ │ + App │
└──────────┘ └─────────┘ └──────────┘
│ │ │
└────────────┴────────────┘
│
┌────────▼─────────┐
│ HPA (自动扩缩容) │
│ 3-10 副本 │
└──────────────────┘
| 环境 | 副本数 | CPU Request | Memory Request | CPU Limit | Memory Limit |
|---|---|---|---|---|---|
| 开发 | 1 | 50m | 64Mi | 200m | 256Mi |
| 测试 | 2 | 100m | 128Mi | 500m | 512Mi |
| 生产 | 3-10 | 200m | 256Mi | 1000m | 1Gi |
详细文档:
GPL-3.0 License
本项目采用 GNU General Public License v3.0 开源协议,该协议提供:
详见 LICENSE 文件。