feat: bundle core modules

pull/583/head
Ryan Wang 2022-06-20 12:25:36 +08:00
parent 2538959339
commit d8c14531e0
5 changed files with 68 additions and 38 deletions

View File

@ -15,7 +15,7 @@ export interface Plugin {
name: string;
/**
* This components will be registered when plugin is activated.
* These components will be registered when plugin is activated.
*/
components?: Component[];

View File

@ -8,18 +8,8 @@ import "./setup/setupStyles";
import { setupComponents } from "./setup/setupComponents";
import { registerMenu } from "@/router/menus.config";
// modules
import dashboardModule from "./modules/dashboard/module";
import postModule from "./modules/contents/posts/module";
import sheetModule from "./modules/contents/sheets/module";
import commentModule from "./modules/contents/comments/module";
import attachmentModule from "./modules/contents/attachments/module";
import themeModule from "./modules/interface/themes/module";
import menuModule from "./modules/interface/menus/module";
import pluginModule from "./modules/system/plugins/module";
import userModule from "./modules/system/users/module";
import roleModule from "./modules/system/roles/module";
import settingModule from "./modules/system/settings/module";
// core modules
import { coreModules } from "./modules";
const app = createApp(App);
@ -27,20 +17,35 @@ setupComponents(app);
app.use(createPinia());
async function registerModule(pluginModule: Plugin) {
function registerModule(pluginModule: Plugin) {
if (pluginModule.components) {
if (!Array.isArray(pluginModule.components)) {
console.error(`${pluginModule.name}: Plugin components must be an array`);
return;
}
for (const component of pluginModule.components) {
component.name && app.component(component.name, component);
}
}
if (pluginModule.routes) {
if (!Array.isArray(pluginModule.routes)) {
console.error(`${pluginModule.name}: Plugin routes must be an array`);
return;
}
for (const route of pluginModule.routes) {
router.addRoute(route);
}
}
if (pluginModule.menus) {
if (!Array.isArray(pluginModule.menus)) {
console.error(`${pluginModule.name}: Plugin menus must be an array`);
return;
}
for (const group of pluginModule.menus) {
for (const menu of group.items) {
registerMenu(group.name, menu);
@ -50,19 +55,7 @@ async function registerModule(pluginModule: Plugin) {
}
function loadCoreModules() {
Array.from<Plugin>([
dashboardModule,
postModule,
sheetModule,
commentModule,
attachmentModule,
themeModule,
menuModule,
pluginModule,
userModule,
roleModule,
settingModule,
]).forEach(registerModule);
coreModules.forEach(registerModule);
}
function loadPluginModules() {
@ -72,8 +65,12 @@ function loadPluginModules() {
initApp();
async function initApp() {
loadCoreModules();
loadPluginModules();
try {
loadCoreModules();
loadPluginModules();
} catch (e) {
console.error(e);
}
app.use(router);
app.mount("#app");
}

27
src/modules/index.ts Normal file
View File

@ -0,0 +1,27 @@
import dashboardModule from "./dashboard/module";
import postModule from "./contents/posts/module";
import sheetModule from "./contents/sheets/module";
import commentModule from "./contents/comments/module";
import attachmentModule from "./contents/attachments/module";
import themeModule from "./interface/themes/module";
import menuModule from "./interface/menus/module";
import pluginModule from "./system/plugins/module";
import userModule from "./system/users/module";
import roleModule from "./system/roles/module";
import settingModule from "./system/settings/module";
const coreModules = [
dashboardModule,
postModule,
sheetModule,
commentModule,
attachmentModule,
themeModule,
menuModule,
pluginModule,
userModule,
roleModule,
settingModule,
];
export { coreModules };

View File

@ -13,6 +13,7 @@ import { useRoute, useRouter } from "vue-router";
import { roles } from "@/modules/system/roles/roles-mock";
import { ref } from "vue";
import { users } from "@/modules/system/users/users-mock";
import { Starport } from "vue-starport";
const route = useRoute();
@ -127,15 +128,21 @@ const handleRouteToUser = (username: string) => {
<div class="flex items-center px-4 py-4">
<div class="flex min-w-0 flex-1 items-center">
<div class="flex-shrink-0">
<div
class="h-12 w-12 overflow-hidden rounded border bg-white hover:shadow-sm"
<Starport
:duration="400"
:port="`user-profile-${user.name}`"
class="h-12 w-12"
>
<img
:alt="user.name"
:src="user.avatar"
class="h-full w-full"
/>
</div>
<div
class="overflow-hidden rounded border bg-white hover:shadow-sm"
>
<img
:alt="user.name"
:src="user.avatar"
class="h-full w-full"
/>
</div>
</Starport>
</div>
<div
class="min-w-0 flex-1 px-4 md:grid md:grid-cols-2 md:gap-4"

View File

@ -29,7 +29,6 @@ export default definePlugin({
{
path: ":username",
component: UserProfileLayout,
alias: ["profile"],
children: [
{
path: "detail",