feat: add tenant and user management with migrations, handlers, and tests

- Implemented tenant and user management features including:
  - Tenant creation and management with associated migrations.
  - User creation and management with associated migrations.
  - Tenant membership management with associated migrations.
  - Platform user roles management with associated migrations.
  - Quota management with associated migrations.
  - Article and template management with associated migrations.
- Added HTTP handlers for templates and workspaces.
- Created tests for protected and public routes.
- Introduced a script to check tenant scope in SQL queries.
- Documented task plan for backend completion and frontend foundation.
This commit is contained in:
2026-04-01 00:58:42 +08:00
commit de30497f59
210 changed files with 23733 additions and 0 deletions
+98
View File
@@ -0,0 +1,98 @@
import { QueryClient, VueQueryPlugin } from "@tanstack/vue-query";
import { createApp } from "vue";
import {
Alert,
App as AntApp,
Avatar,
Badge,
Button,
Card,
Checkbox,
Col,
ConfigProvider,
DatePicker,
Descriptions,
Drawer,
Dropdown,
Empty,
Form,
Input,
InputNumber,
Layout,
List,
Menu,
Modal,
Popconfirm,
Progress,
Radio,
Row,
Select,
Skeleton,
Spin,
Statistic,
Steps,
Table,
Tabs,
Tag,
Tooltip,
} from "ant-design-vue";
import App from "./App.vue";
import { i18n } from "./i18n";
import { router } from "./router";
import { pinia } from "./stores/pinia";
import "./styles.css";
import "ant-design-vue/dist/reset.css";
const queryClient = new QueryClient({
defaultOptions: {
queries: {
staleTime: 30000,
refetchOnWindowFocus: false,
retry: false,
},
},
});
const app = createApp(App);
[
Alert,
AntApp,
Avatar,
Badge,
Button,
Card,
Checkbox,
Col,
ConfigProvider,
DatePicker,
Descriptions,
Drawer,
Dropdown,
Empty,
Form,
Input,
InputNumber,
Layout,
List,
Menu,
Modal,
Popconfirm,
Progress,
Radio,
Row,
Select,
Skeleton,
Spin,
Statistic,
Steps,
Table,
Tabs,
Tag,
Tooltip,
].forEach((component) => {
app.use(component);
});
app.use(i18n).use(pinia).use(router).use(VueQueryPlugin, { queryClient }).mount("#app");