中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當前位置: 首頁 > news >正文

簡約大氣網站設計欣賞愛站seo綜合查詢

簡約大氣網站設計欣賞,愛站seo綜合查詢,做火鍋加盟哪個網站好,微信 html5 網站前言 如果對 vue3 的語法不熟悉的,可以移步Vue3.0 基礎入門,快速入門。 1. 系統(tǒng)頁面結構 由 menu,面包屑,用戶信息,頁面標簽,頁面內容構建 ? 2. 創(chuàng)建頁面 創(chuàng)建 src/pages/layout.vue 布局頁 創(chuàng)建 sr…

前言

如果對 vue3 的語法不熟悉的,可以移步Vue3.0 基礎入門,快速入門。

1. 系統(tǒng)頁面結構

由 menu,面包屑,用戶信息,頁面標簽,頁面內容構建

?

?2. 創(chuàng)建頁面

創(chuàng)建 src/pages/layout.vue 布局頁

創(chuàng)建 src/pages/components/layout-menu.vue menu 組件

創(chuàng)建 src/pages/components/layout-crumbs.vue 面包屑 組件

創(chuàng)建 src/pages/components/layout-user.vue 用戶信息 組件

創(chuàng)建 src/pages/components/layout-tag.vue 頁面標簽 組件

創(chuàng)建 src/pages/components/layout-content.vue 頁面內容 組件

?

?3. 構建 src/pages/layout.vue 布局頁

<script setup>import { ref } from "vue";import {NLayout,NLayoutSider,NLayoutHeader,NLayoutContent,} from "naive-ui";// menuimport layoutMenu from "./components/layout-menu.vue";// 面包屑import layoutCrumbs from "./components/layout-crumbs.vue";// 用戶信息import layoutUser from "./components/layout-user.vue";// 頁面標簽import layoutTag from "./components/layout-tag.vue";// 頁面內容import layoutContent from "./components/layout-content.vue";// 是否展開menulet isOpen = ref(true);// n-layout-sider 折疊狀態(tài)發(fā)生改變時的回調函數function handleChangeSider(isHide) {if (isHide) {isOpen.value = !isHide;}}// n-layout-sider 完成展開后的回調function handleEnter() {isOpen.value = true;}// n-layout-sider 是否顯示邊框let bordered = ref(true);// n-layout-sider 是否反轉背景色let inverted = ref(false);// n-layout-sider 是否在自身使用原生滾動條。如果設定為 false,Sider 將會對內容使用 naive-ui 風格的滾動條let scrollbar = ref(false);// n-layout-sider 折疊寬度let colWidth = ref(50);// n-layout-sider 展開寬度let siderWidth = ref(155);
</script><template><!-- layout 盒子 --><n-layout has-sider class="layout-box"><!-- 左側導航 --><n-layout-sidercollapse-mode="width"show-trigger="arrow-circle":bordered="bordered":inverted="inverted":native-scrollbar="scrollbar":collapsed-width="colWidth":width="siderWidth"@update:collapsed="handleChangeSider"@after-enter="handleEnter"><layout-menu :isOpen="isOpen" :inverted="inverted"></layout-menu></n-layout-sider><!-- 右側內容 --><n-layout><n-layout-header :bordered="bordered"><div class="layout-header__box"><layout-crumbs></layout-crumbs><layout-user></layout-user></div><!--  --><layout-tag></layout-tag><div class="layout-header__shadow"></div></n-layout-header><n-layout-content><layout-content></layout-content></n-layout-content></n-layout></n-layout>
</template><style lang="scss" scoped>.layout-box {width: 100vw;height: 100vh;box-sizing: border-box;}.layout-header__box {display: flex;align-items: center;justify-content: space-between;padding: 20px;box-sizing: border-box;height: 50px;border-bottom: 1px solid rgb(239, 239, 245);}.layout-header__shadow {width: 100%;height: 2px;background: #d9d9d9;}
</style>

4. 構建 src/pages/components/layout-menu.vue menu 組件

<script setup>import { ref, watch, computed } from "vue";import { useRoute } from "vue-router";import { NMenu } from "naive-ui";import { usePermissionStore } from "@/store/permission.js";import { useTagStore } from "@/store/tag.js";import router from "@/router/index.js";defineProps({isOpen: Boolean,inverted: Boolean,});let route = useRoute();let permissionStore = usePermissionStore();let tagStore = useTagStore();let menuOptions = computed(() => {return permissionStore.siderMenu;});let activeMenuValue = ref("");watch(() => route.name,() => {activeMenuValue.value = route.name;permissionStore.activeMenuValue = route.name;},{ immediate: true, deep: true });// 新增 taglet obj = { title: route.meta.title, key: route.name };tagStore.addTag(obj);let handleUpdateMenu = (value, item) => {// 新增 taglet { title, key } = item;let obj = { title, key };tagStore.addTag(obj);router.push(`/${value}`);activeMenuValue.value = value;};
</script><template><!-- logo --><divclass="layout-sider__logo c-center":class="{ isHide: !isOpen }"@click="$router.push('/home')"><svg-icon name="vite"></svg-icon><!-- <img src="@/assets/images/logo.png" /> --><h1 v-show="isOpen">后臺管理系統(tǒng)</h1></div><!-- menu組件 --><n-menu:inverted="inverted":indent="15":root-indent="15":options="menuOptions":value="activeMenuValue"@update:value="handleUpdateMenu"></n-menu>
</template><style lang="scss" scoped>.layout-sider__logo {height: 50px;font-size: 14px;font-weight: bold;cursor: pointer;img {margin-right: 5px;width: 25px;object-fit: contain;}svg {margin-right: 5px;}}.isHide {img {width: 30px;}}
</style>

4.1 構建 src/store/permission.js 權限狀態(tài)管理

根據后端返回動態(tài)路由數據,構建導航 menu 和動態(tài)路由。

import { defineStore } from "pinia";
import { h } from "vue";
import { RouterLink } from "vue-router";
// 接口獲取路由 自己對接口
// import { getRouters } from "@/api/menu.js";
import SvgIcon from "@/components/SvgIcon.vue";
import { routerData } from "@/mock/datas.js";const modules = import.meta.glob("../pages/*.vue");//  icon 標簽
let renderIcon = (name) => {return () => h(SvgIcon, { name }, null);
};// 單個路由
let getRouterItem = (item) => {let { name, path, meta, component } = item;let obj = {path,name,meta,component: modules[`../pages/${component}`],};return obj;
};// 獲取異步路由
// 所有異步路由都是layout的子路由,并且routers只有一層children,沒有考慮很復雜的情況。
// 將所有異步路由都存放在rmenu數組中,返回。
let getAayncRouter = (routers) => {let rmenu = [];routers.forEach((item) => {if (item.children && item.children.length) {item.children.map((_item) => {let obj = getRouterItem(_item);obj.meta.parentTitle = item.meta.title;rmenu.push(obj);});} else {rmenu.push(getRouterItem(item));}});return rmenu;
};// 獲取側邊欄導航
let getSiderMenu = (routers) => {let smenu = [];routers.forEach((item) => {let children = [];let obj = {};if (item.children && item.children.length) {// 二級 menuitem.children.map((_item) => {if (!_item.hidden) {children.push({label: () =>h(RouterLink,{ to: _item.path },{ default: () => _item.meta.title }),title: _item.meta.title,key: _item.name,icon: renderIcon(_item.meta.icon),});}});obj = {label: item.meta.title,title: item.meta.title,key: item.name,icon: renderIcon(item.meta.icon),children,};} else {// 一級 menuobj = {label: () =>h(RouterLink, { to: item.path }, { default: () => item.meta.title }),title: item.meta.title,key: item.name,icon: renderIcon(item.meta.icon),};}smenu.push(obj);});return smenu;
};export const usePermissionStore = defineStore({id: "permissionStore",state: () => {return {siderMenu: [],activeMenuValue: "",};},actions: {getRouters() {return new Promise((resolve, reject) => {this.siderMenu = getSiderMenu(routerData);resolve(getAayncRouter(routerData));// getRouters()//   .then(({ data }) => {//     this.siderMenu = getSiderMenu(data);//     resolve(data);//   })//   .catch((err) => {//     reject(err);//   });});},},
});

4.1.1 構建 src/mock/datas.js 虛擬路由數據

模仿后端返回動態(tài)路由數據結構

export const routerData = [{name: "home",path: "/home",hidden: false,component: "home.vue",meta: {title: "首頁",icon: "home",},children: null,},{name: "system",path: "/system",hidden: false,component: null,meta: {title: "系統(tǒng)管理",icon: "system",},children: [{name: "system-menu",path: "/system-menu",hidden: false,component: "system-menu.vue",meta: {title: "系統(tǒng)菜單",icon: "system-menu",},children: null,},{name: "system-dict",path: "/system-dict",hidden: false,component: "system-dict.vue",meta: {title: "系統(tǒng)字典",icon: "system-dict",},children: null,},],},{name: "user",path: "/user",hidden: false,component: null,meta: {title: "用戶管理",icon: "user",},children: [{name: "user-user",path: "/user-user",hidden: false,component: "user-user.vue",meta: {title: "用戶管理",icon: "user-user",},children: null,},{name: "user-role",path: "/user-role",hidden: false,component: "user-role.vue",meta: {title: "角色管理",icon: "user-role",},children: null,},],},
];


4.1.2 新增 src/assets/svg 路由圖標

?

4.2 構建 src/store/tag.js 頁面標簽狀態(tài)管理

點擊左側導航路由,頁面標簽變化

import { defineStore } from "pinia";export const useTagStore = defineStore({id: "tag",state: () => {return {tags: [{ title: "首頁", key: "home" }],activeTagIndex: 0,};},getters: {tagsKey(state) {let arr = [];state.tags.map((tag) => {arr.push(tag.key);});return arr;},},actions: {addTag(tag) {if (!this.tagsKey.includes(tag.key)) {this.tags.push(tag);}},removeTag(key) {let index = this.tagsKey.indexOf(key);this.tags.splice(index, 1);this.activeTagIndex = index - 1;},},
});

4.3 完善 src/router/index.js 路由

路由監(jiān)聽動態(tài)加載路由

import { createRouter, createWebHistory } from "vue-router";
import NProgress from "nprogress";
import "nprogress/nprogress.css";
import baseRouters from "./baseRouter.js";
import { getToken } from "@/utils/cookie.js";
import { useUserStore } from "@/store/user.js";
import { usePermissionStore } from "@/store/permission.js";const whiteList = ["/", "/login"];const routes = [...baseRouters];
const _createRouter = () =>createRouter({history: createWebHistory(),routes,scrollBehavior() {return {el: "#app",top: 0,behavior: "smooth",};},});export function resetRouter() {const newRouter = _createRouter();router.matcher = newRouter.matcher;
}const router = _createRouter();// 路由監(jiān)聽
router.beforeEach((to, from, next) => {NProgress.start();let userStore = useUserStore();let permissionStore = usePermissionStore();// 判斷是否登錄if (!!getToken()) {// 已登錄,跳轉登錄頁,轉跳首頁if (to.path === "/login") {next("");NProgress.done();} else {if (userStore.roles.length === 0) {userStore.getInfo().then((res) => {// 獲取動態(tài)路由permissionStore.getRouters().then((_res) => {let resetRouters = {path: "/layout",name: "layout",component: () => import("@/pages/layout.vue"),children: _res,};router.addRoute(resetRouters);// 這句代碼,重要!重要!重要!// 來確保addRoute()時動態(tài)添加的路由已經被完全加載上去。沒有這句,動態(tài)路由加載后無效next({ ...to, replace: true });});}).catch((err) => {window.$msg.error(err);userStore.logout().then(() => {next({ name: "login" });});});} else {next();}}NProgress.done();} else {// 判斷路由是否在白名單,是直接跳轉if (whiteList.indexOf(to.path) !== -1) {next();// 未登錄頁面跳轉,直接跳轉到登錄頁} else {next(`/login?redirect=${to.fullPath}`);}NProgress.done();}
});export default router;

5. 構建 src/pages/components/layout-crumbs.vue 面包屑組件

<script setup>import { watch, ref } from "vue";import { NBreadcrumb, NBreadcrumbItem } from "naive-ui";import { useRoute } from "vue-router";let route = useRoute();// 判斷是二級目錄let getCrumList = (nowRoute) => {let arr = [nowRoute.meta.title];!!nowRoute.meta.parentTitle && arr.unshift(nowRoute.meta.parentTitle);return arr;};let crumbList = ref([]);// 監(jiān)聽路由,獲取crumlistwatch(() => route,(newRoute) => {crumbList.value = getCrumList(newRoute);},{ immediate: true, deep: true });
</script><template><n-breadcrumb><n-breadcrumb-itemclass="layout-crumbs-item"v-for="(item, index) in crumbList":key="index">{{ item }}</n-breadcrumb-item></n-breadcrumb>
</template><style lang="scss" scoped>.layout-crumbs-item {font-size: 16px;}
</style>

6. 構建 src/pages/components/layout-user.vue 用戶信息 組件

<script setup>import { reactive, h, computed } from "vue";import { useDialog, NDropdown, NButton } from "naive-ui";import { useUserStore } from "@/store/user.js";import { useTagStore } from "@/store/tag.js";import router from "@/router/index.js";let userStore = useUserStore();let tagStore = useTagStore();// 登錄才獲取用戶信息userStore.getInfo();// 獲取 用戶信息let avatar = computed(() => {if (!!userStore.user?.avatar) {return userStore.user.avatar;} else {return "";}});let userName = computed(() => {if (!!userStore.user?.userName) {return userStore.user.userName;} else {return "";}});// 下拉選項let baseOptions = reactive([{label: "個人信息",key: "userinfo",},{label: "修改密碼",key: "editpassword",},{label: "退出系統(tǒng)",key: "logout",},]);// 選擇操作let dialog = useDialog();// 確認登出let submitLogout = () => {userStore.logout().then(() => {router.push("/home");dialog.destroyAll();window.location.reload();});};// 取消登出let cancelLogOut = () => {dialog.destroyAll();};let handleSelect = (key, item) => {if (["userinfo", "editpassword"].includes(key)) {// 新增 taglet obj = { title: item.label, key };tagStore.addTag(obj);router.push(`/${key}`);} else {dialog.warning({closable: false,showIcon: false,style: {width: "20%",},title: () => {return h("div",{style: {position: "absolute",top: 0,left: 0,right: 0,textAlign: "center",height: "40px",lineHeight: "40px",background: "#cee6f0",color: "#1d69a3",fontWeight: "bold",fontSize: "16px",},},"退出登錄");},content: () => {return h("p",{style: {textAlign: "center",height: "80px",lineHeight: "108px",color: "#000",fontSize: "14px",fontWeight: "bolder",userSelect: "none",},},"是否退出當前賬號?");},action: () => {return h("div",{style: {width: "100%",display: "flex",justifyContent: "space-around",},},[h(NButton,{onClick: cancelLogOut,style: {width: "40%",},},{default: () => "取消",}),h(NButton,{onClick: submitLogout,type: "info",style: {width: "40%",},},{default: () => "退出",}),]);},});}};
</script><template><n-dropdowntrigger="click":options="baseOptions"@select="handleSelect"size="small"><div class="header-right_user-box"><div class="header-right_user-avatar"><img v-if="avatar" class="header-right_avatar" :src="avatar" /><svg-icon v-else name="avatar" width="35" height="35"></svg-icon></div><div class="header-right_user-name"><span>{{ userName }}</span><svg-icon name="down" width="10"></svg-icon></div></div></n-dropdown>
</template><style lang="scss" scoped>.header-right_user-box {display: flex;align-items: center;cursor: pointer;user-select: none;}.header-right_user-avatar {display: flex;align-items: center;justify-content: center;width: 40px;height: 40px;border-radius: 10px;overflow: hidden;img {width: 100%;height: 100%;object-fit: contain;}}.header-right_user-name {span {margin: 0 5px;}}
</style>

7. 構建 src/pages/components/layout-tag.vue 頁面標簽 組件

<script setup>import { computed } from "vue";import { NTag } from "naive-ui";import { useTagStore } from "@/store/tag.js";import { usePermissionStore } from "@/store/permission.js";import router from "@/router/index.js";let tagStore = useTagStore();let permissionStore = usePermissionStore();let tags = computed(() => {return tagStore.tags;});function handleClose(key) {tagStore.removeTag(key);if (permissionStore.activeMenuValue == key) {permissionStore.activeMenuValue = tags.value[tagStore.activeTagIndex].key;router.push(`/${permissionStore.activeMenuValue}`);}}function handleCheck(item) {let { key } = item;permissionStore.activeMenuValue = key;router.push(`/${key}`);}
</script><template><div class="layout-header__tag"><n-tagv-for="item in tags":key="item.key"class="tag-item":closable="item.key !== 'home'":type="item.key == permissionStore.activeMenuValue ? 'success' : ''"size="small"@close="handleClose(item.key)"@click="handleCheck(item)">{{ item.title }}</n-tag></div>
</template><style lang="scss" scoped>.layout-header__tag {padding-left: 10px;display: flex;align-items: center;height: 30px;}.tag-item {margin-right: 5px;cursor: pointer;}
</style>

8. 構建 src/pages/components/layout-content.vue 頁面內容 組件

<script setup></script><template><div class="layout-content"><router-view v-slot="{ Component, route }"><transition name="mainFade" mode="out-in"><component :is="Component" :key="route.path"></component></transition></router-view></div>
</template><style lang="scss" scoped>.layout-content {padding: 20px;margin: 20px;// height: auto;height: calc(100vh - 170px);border: 1px solid #e9e9e9;border-radius: 5px;-webkit-box-shadow: rgba(0, 0, 0, 0.047) 0 0 5px;box-shadow: 0 0 5px rgba(0, 0, 0, 0.047);}.mainFade-enter-from {transform: translate(-80px);opacity: 0;}.mainFade-leave-to {transform: translate(80px);opacity: 0;}.mainFade-leave-from,.mainFade-enter-to {transform: translate(0px);opacity: 1;}.mainFade-enter-active {transition: all 0.1s ease;}.mainFade-leave-active {transition: all 0.1s cubic-bezier(1, 0.6, 0.6, 1);}
</style>

9. 創(chuàng)建如下內容頁

src/pages/404.vue

src/pages/demo.vue

src/pages/eidtpassword.vue

src/pages/userinfo.vue

src/pages/system-dict.vue

src/pages/system-menu.vue

src/pages/user-user.vue

src/pages/user-role.vue

?頁面基礎構建如 demo.vue

<script setup></script><template><div class="demo">demo</div>
</template><style lang="scss" scoped></style>

?綜上

layout 動態(tài)路由布局構建完成。下一章:基礎框架搭建完了,后續(xù)完善到哪更新哪

http://m.risenshineclean.com/news/60859.html

相關文章:

  • 企業(yè)門戶網站布局特征軟件推廣平臺
  • 手機企業(yè)網站推廣網絡廣告的計費方式
  • 宜昌網頁設計便宜的seo網絡營銷推廣
  • 電子政務政府網站建設方案云客網平臺
  • 沒簽合同網站做不好百度極簡網址
  • 購物網站平臺建設自己做網站
  • 自己怎么建立自己的國際網站晉城今日頭條新聞
  • 網站域名com和cn百度識圖網頁版
  • 帝國cms做中英文網站電商網站建設哪家好
  • 地方門戶網站建設要求福州百度分公司
  • wordpress附件插件南寧seo推廣優(yōu)化
  • 建設企業(yè)資質雙網是哪兩個網站線上推廣平臺都有哪些
  • 福州正規(guī)網站建設公司報價軟文廣告案例分析
  • 酒店網站設計模板免費創(chuàng)建網站的平臺
  • 手機微網站優(yōu)化大師使用心得
  • 網站建設聯盟深圳互聯網公司50強
  • 自適應網站如何做mip網頁快速排名優(yōu)化seo
  • 長葛網站建設公司最近國際新聞大事20條
  • 定制開發(fā)平臺電商網站seo怎么做
  • 哪個網站可以接任務做兼職移動網站如何優(yōu)化排名
  • 網站開發(fā)期間賬務處理新產品推廣
  • 網站設計步驟畢業(yè)論文互聯網營銷師證書怎么考多少錢
  • 湛江cms建站排名點擊工具
  • 千華網鞍山門戶網站關鍵詞搜索站長工具
  • h5制作軟件電腦百度ocpc怎么優(yōu)化
  • 中國建設銀行北海招聘信息網站百度旗下產品
  • 視頻網站app怎么做的長春做網絡優(yōu)化的公司
  • 外貿網站推廣計劃關鍵詞排名工具
  • 青島公司網站建設公司seo關鍵詞排名優(yōu)化案例
  • 網站如何防盜鏈網站運營策劃書范文