Node+MySQL+Vue2.0+elementUI实现的博客管理系统(一)

前端部分:

Vue项目的入口文件main.js:

//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入VueRouter
import VueRouter from 'vue-router'
import router from './router/index'
import Vuex from 'vuex'
import store from './store'
//完整引入
//引入ElementUI组件库
import ElementUI from 'element-ui';
//引入ElementUI全部样式
import 'element-ui/lib/theme-chalk/index.css';
import './assets/css/reset.css'
import api from './api/index'
import * as  echarts from 'echarts'
// 引入图标库
import './assets/icon/icon.css'
import './assets/fonts/iconfont.css'
//引入mavon-editor
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
// //引入动画
// import animate from 'animate.css'//代码高亮
// import '../src/plugins/hljs.js'
//引入Swiper
// import 'swiper/css/swiper.css'
import hljs from 'highlight.js';Vue.directive('highlight', function (el) {let blocks = el.querySelectorAll('pre code');blocks.forEach((block) => {hljs.highlightBlock(block)})
})import 'highlight.js/styles/atom-one-dark.css'
//引入音频插件
import APlayer from 'vue-aplayer';Vue.use(APlayer, {defaultCover: 'https://github.com/u3u.png',productionTip: true,
});import 'swiper/swiper-bundle.css'
// 引入插件
import plugins from '../src/plugins/plugins'
Vue.use(plugins)
//引入瀑布流插件
import waterfall from 'vue-waterfall2'
Vue.use(waterfall)
Vue.prototype.$echarts = echarts
// import { json } from 'express'
Vue.prototype.$api = api
Vue.use(ElementUI)
Vue.use(VueRouter)
Vue.use(Vuex)
Vue.use(mavonEditor)//关闭Vue的生产提示
Vue.config.productionTip = false
//登录持久化
//用户信息
let username = localStorage.getItem('username')
if (username) {username = JSON.parse(username)store.commit('loginModule/setUser', username)
}
//管理员信息
let adminname = localStorage.getItem('lwandzxl')
if (adminname){adminname = JSON.parse(adminname)store.commit('AdminLogin/setAdmin', adminname)
}
//管理员登录ip
let adminaddress = localStorage.getItem('lwandzxladdress')
if (adminaddress) {adminaddress = JSON.parse(adminaddress)store.commit('AdminLoginAddress/setAddress', adminaddress)
}
// let bgzxl = localStorage.getItem('bgzxl')
// if (bgzxl) {
// 	bgzxl = JSON.parse(bgzxl)
// 	store.commit('loginModule/setAdmin', bgzxl)
// }
//判断token是否失效
import axios from 'axios' // 引入axios
Vue.prototype.$axios = axios
import Storage from '@/assets/js/storage.js'
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded'
/* 请求拦截器 */axios.interceptors.request.use(function (config) { // 每次请求时会从localStorage中获取tokenlet token = Storage.localGet('token')if (token) {token = 'bearer' + ' ' + token.replace(/'|"/g, '') // 把token加入到默认请求参数中config.headers.common['Authorization'] = token}return config
}, function (error) {return Promise.reject(error)
})/* 响应拦截器 */axios.interceptors.response.use(function (response) { // ①10010 token过期(30天) ②10011 token无效if (response.data.code === 10010 || response.data.code === 10011) {Storage.localRemove('token') // 删除已经失效或过期的token(不删除也可以,因为登录后覆盖)router.replace({path: '/login' // 到登录页重新获取token})} else if (response.data.token) { // 判断token是否存在,如果存在说明需要更新tokenStorage.localSet('token', response.data.token) // 覆盖原来的token(默认一天刷新一次)}return response
}, function (error) {return Promise.reject(error)
})new Vue({el: '#app',render: h => h(App),router: router,store,beforeCreate() {Vue.prototype.$bus = this}
})

路由文件router.js

import Vue from 'vue'
import VueRouter from 'vue-router'
/*
在原始的 Vue Router 中,当使用 this.$router.push(location) 导航到一个新路由时,如果目标路由不存在,则会抛出错误。
这个代码块可以解决这个问题
*/
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {return originalPush.call(this, location).catch(err => err)
}Vue.use(VueRouter)
const router = new VueRouter({routes: [{path: '',//redirect: '/home',name: 'index', 把/home设置为首页redirect: '/home',name: 'index',component: () => import('../views/Layout/index'),children: [{path: '/home',name: 'home',component: () => import('../views/components/Home/Home')},{path: 'todos',name: 'todos',component: () => import('../components/Todos/Todos')},{path: 'tools',name: 'tools',component: () => import('../components/Tools/index'),children: [{path: 'fanyi',name: 'fanyi',component: () => import('../components/Tools/Fanyi')},{path: 'weather',name: 'weather',component: () => import('../components/Tools/Weather')},{path: 'photos',name: 'photos',component: () => import('../components/Tools/Photo')}, {path: 'word',name: 'word',component: () => import('../components/Tools/Word')},]},{path: 'usercenter',name: 'usercenter',meta: { isLogin: true },component: () => import('../../src/views/components/Usercenter/Usercenter'),},{name: 'userinfoedit',path: 'userinfoedit',component: () => import('../components/Userinfoedit/Userinfoedit')},{name: 'photo',path: 'photo',component: () => import('../views/components/Photo/Photo')},{name: 'video',path: 'video',component: () => import('../views/components/Video/Video')},{name: 'article',path: 'article',component: () => import('../../src/views/components/Article/Article')},{name: 'articleinfo',path: 'articleinfo',component: () => import('../../src/components/ArticleInfo/ArticleInfo')},{name: 'search',path: 'search',component: () => import('../../src/components/Search/Search')},{name: 'messageinfo',path: 'messageinfo',component: () => import('../../src/components/Message/MessageInfo')},]},{path: '/login',name: 'login',component: () => import('../views/components/Login/Login')},{path: '/register',name: 'register',component: () => import('../views/components/Register/Register')},{path: '/adminlogin',name: 'adminlogin',component: () => import('../Admin/AdminLogin/AdminLogin')},{path: '/admin',name: 'admin',meta: { isAdminLogin: true },component: () => import('../Admin/Layout/index'),children: [{path: 'userlist',name: 'userlist',component: () => import('../Admin/User/UserList')},{path: 'adduser',name: 'adduser',component: () => import('../Admin/User/AddUser')},{path: 'updateuser',name: 'updateuser',component: () => import('../Admin/User/UpdateUser')},{path: 'addphoto',name: 'addphoto',component: () => import('../Admin/Photo/AddPhoto')},{path: 'photolist',name: 'photolist',component: () => import('../Admin/Photo/PhotoList')},{path: 'home',name: '/admin/home',component: () => import('../Admin/Home/Home')},{path: 'articlelist',name: 'articlelist',component: () => import('../Admin/Article/ArticleList')},{path: 'huishouzhan',name: 'huishouzhan',component: () => import('../Admin/Article/Huishouzhan')},{path: 'addarticle',name: 'addarticle',component: () => import('../Admin/Article/Add')},{path: 'editarticle',name: 'editarticle',component: () => import('../Admin/Article/Edit')},{path: 'comment',name: 'comment',component: () => import('../Admin/Article/Comment')},{path: 'system',name: 'system',component: () => import('../Admin/System/System')},{path: 'videolist',name: 'videolist',component: () => import('../Admin/Video/VideoList')},{path: 'addvideo',name: 'addvideo',component: () => import('../Admin/Video/AddVideo')},{path: 'message',name: 'message',component: () => import('../Admin/Message/Message')},{path: 'category',name: 'category',component: () => import('../Admin/Category/Category')},]}]
})
//获取vuex数据
import store from '../store/index'
//用户路由拦截
router.beforeEach((to, from, next) => {// to and from are both route objects. must call `next`.//需要登录if (to.meta.isLogin) {let token = store.state.loginModule.userinfo.tokenif (token) {next()} else if (confirm('您还没有登录,确定登录吗?')) {next('/login')this.$router.go(-1)}} else {//不需要登录next()}
})export default router

登录页面:

在这里插入图片描述

<template><div class="login"><h3 class="title">登录界面</h3><el-form:model="loginForm"status-icon:rules="rules"ref="loginForm"label-width="60px"class="demo-loginForm"><el-form-item label="账号" prop="username"><el-inputtype="text"v-model="loginForm.username"autocomplete="off"></el-input></el-form-item><el-form-item label="密码" prop="password"><el-inputtype="password"v-model="loginForm.password"autocomplete="off"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm('loginForm')">登录</el-button><el-button @click="resetForm('loginForm')">重置</el-button><span class="zhuce" @click="register">没有账户?去注册</span><span class="youke" @click="zhuye">我是游客</span></el-form-item></el-form></div>
</template><script>
import jwt from "jwt-decode";
import { mapMutations } from "vuex";
export default {name: "Login",data() {var validateLname = (rule, value, callback) => {if (value === "") {callback(new Error("请输入账户😊"));} else {callback();}};var validatePass = (rule, value, callback) => {if (value === "") {callback(new Error("请输入密码😊"));} else {callback();}};return {bodyImg: "url(" + require("../../../assets/img/loginbg.jpg") + ")",loginForm: {username: "",password: "",},rules: {username: [{ validator: validateLname, trigger: "blur" }],password: [{ validator: validatePass, trigger: "blur" }],},};},//设置背景图片mounted() {document.body.style.backgroundImage = this.bodyImg;document.body.style.backgroundSize = "100%";//注册成功后,跳转登录界面,通过读取localStorage里的数据,使得登录的账户,密码就是注册的账户,密码let register = localStorage.getItem("register");if (register) {register = JSON.parse(register);this.loginForm.username = register.username;this.loginForm.password = register.password;}},beforeMount() {document.body.style.backgroundImage = "";},beforeDestroy() {this.$bus.$off("zxl");},methods: {//游客身份跳转主页zhuye() {this.$router.push("/");},register() {this.$router.push("/register");},...mapMutations("loginModule", ["setUser"]),submitForm(formName) {this.$refs[formName].validate((valid) => {if (valid) {console.log("校验通过", this.loginForm);let { username, password } = this.loginForm;// 请求登录接口this.$api.getLogin({username,password,}).then((res) => {console.log("解析前", res.data);if (res.data.status === 200) {console.log("解析后", jwt(res.data.data));//登录成功后:1. 存储登录信息  2. 跳转网页 3. 顶部区域显示用户信息  4. 持久化let obj = {username: jwt(res.data.data).username,token: res.data.data,avatar: res.data.avatar,email: res.data.email,};console.log("obj", obj);this.setUser(obj);//存储本地localStorage.setItem("loginStatus", true);localStorage.setItem("username", JSON.stringify(obj));//跳转this.$router.push("/home");this.$message({message: "恭喜您,登录成功😊",type: "success",});//清除注册成功的用户数据localStorage.removeItem("register");} else {//账户或密码错误this.$message({message: "警告哦,账户或密码错误😊",type: "warning",});}});} else {console.log("error submit!!");return false;}});},resetForm(formName) {this.$refs[formName].resetFields();},},
};
</script>

项目主页:

在这里插入图片描述

<template><div class="main"><!-- 顶部区域 --><div class="header"><!-- <div class="logo"><div class="zxl"><img src="../../assets/img/logo3.png" alt="" /></div><div class="lw"><img src="../../assets/img/logo2.png" alt="" /></div></div> --><div class="search"><el-inputplaceholder="请输入内容"v-model="val"@keydown.native.enter="goSearch(val.trim())"><i slot="prefix" class="el-input__icon el-icon-search"></i></el-input><button class="hhh" @click="goSearch(val.trim())">搜索</button></div><div class="login"><i v-show="userinfo.username === 'admin'">欢迎超级管理员:</i><i v-show="userinfo.username !== 'admin'">欢迎:</i>{{ userinfo.username || " 游客" }}<span v-show="userinfo.username" @click="loginout"><i class="el-icon-loading"></i> 退出登录</span><span v-show="userinfo.username === ''" @click="login"><i class="el-icon-loading"></i> 登录</span><span v-show="userinfo.username === ''" @click="register"> 注册</span><!-- <span @click="loginout"> 退出登录</span> --></div><!-- <div class="light"><Light @changeBackground="changeBG"></Light></div> --></div><!-- 内容区域 --><div class="layout"><Leftmenu class="leftmenu"></Leftmenu><Rightmenu class="rightmenu"></Rightmenu><Content class="content"></Content></div><transitionappearname="animate__animated animate__bounce"enter-active-class="animate__backInUp"leave-active-class="animate__backOutDown"><div class="gotop" v-if="istop" @click="gotop"><img src="../../assets/img/gotop.png" alt="" /></div></transition></div>
</template><script>
import "animate.css";
import { mapState } from "vuex";
import { mapMutations } from "vuex";
import Fengche from "../../components/Fengche/Fengche";
import Content from "./Content";
import Leftmenu from "./Leftmenu";
import Rightmenu from "./Rightmenu";
import Light from "../../components/Light/Light";
export default {name: "index",data() {return {istop: false,val: "",bodyImg: "url(" + require("../../assets/img/bg111.jpg") + ")",bodyImg1: "url(" + require("../../assets/img/night.gif") + ")",isclick: true,};},components: {Content,Leftmenu,Rightmenu,Light,Fengche,},computed: {...mapState("loginModule", ["userinfo"]),},watch: {isclick(val) {console.log("变化", val);if (val === true) {document.body.style.backgroundImage = this.bodyImg;document.body.style.backgroundSize = "100%";document.body.style.backgroundAttachment = "fixed";} else {document.body.style.backgroundImage = this.bodyImg1;document.body.style.backgroundSize = "100%";document.body.style.backgroundAttachment = "fixed";}},},// watch: {//   val(val, oldval) {//     console.log("新", val);//     console.log("旧", oldval);//     if (val !== oldval) {//       this.val = val;//     }//   },// },methods: {//搜索goSearch(val) {if (val == "") {return this.$message.error("错了哦,输入不能为空");}this.$router.push(`/search?content=${val}`);},changeBG() {this.isclick = !this.isclick;// console.log(this.isclick);// document.body.style.backgroundImage = `${//   this.click ? this.bodyImg : this.bodyImg1// } `;// document.body.style.backgroundSize = "100%";// document.body.style.backgroundAttachment = "fixed";},...mapMutations("loginModule", ["clearUser"]),//退出登录loginout() {//清空vuex数据this.clearUser();//清空本地数据localStorage.removeItem("username");localStorage.removeItem("loginStatus");//返回登录this.$router.push("/login");},login() {this.$router.push("/login");},register() {this.$router.push("/register");},handleScroll(e) {let scrollTop =document.body.scrollTop || document.documentElement.scrollTop;if (scrollTop >= 480) {this.istop = true;}if (scrollTop < 480) {this.istop = false;}// if (e.target.scrollTop > 700) this.istop = true;},gotop() {let top = document.documentElement.scrollTop || document.body.scrollTop;const timeTop = setInterval(() => {document.body.scrollTop =document.documentElement.scrollTop =top -=50;if (top < 0) {clearInterval(timeTop);}}, 10);},},mounted() {document.body.style.backgroundImage = this.bodyImg;document.body.style.backgroundSize = "100%";document.body.style.backgroundAttachment = "fixed";window.addEventListener("scroll", this.handleScroll);},beforeMount() {document.body.style.backgroundImage = "";},beforeDestroy() {window.removeEventListener("scroll", this.handleScroll);},
};
</script>

left:

<template><el-menu:default-active="$route.path"class="el-menu-vertical-demo"@open="handleOpen"@close="handleClose"background-color="rgba(0,0,0,0.5)"text-color="#fff"active-text-color="#ffd04b"@select="handleSelect"><el-menu-item index="/home"><i class="iconfont icon-shouye"></i><span slot="title"><router-link to="/home"> 首页</router-link></span></el-menu-item><el-menu-item index="/article"><i class="iconfont icon-16"></i><span slot="title"><router-link to="/article"> 文章</router-link></span></el-menu-item><el-menu-item index="/todos"><i class="iconfont icon-zuozhe2"></i><span slot="title"><router-link to="/todos"> 记事本</router-link></span></el-menu-item><el-menu-item index="/photo"><i class="iconfont icon-tupian"></i><span slot="title"><router-link to="/photo"> 相册</router-link></span></el-menu-item><el-menu-item index="/video"><i class="iconfont iconfont icon-shipin"></i><span slot="title"><router-link to="/video"> 视频</router-link></span></el-menu-item><el-menu-item index="/messageinfo"><i class="iconfont icon-liuyanban"></i><span slot="title"><router-link to="/messageinfo"> 留言板</router-link></span></el-menu-item><el-menu-item index="/usercenter"><i class="iconfont icon-yonghuxinxi-"></i><span slot="title"><router-link to="/usercenter"> 个人中心</router-link></span></el-menu-item><el-menu-item index="/tools"><i class="iconfont icon-gongjuxiang1"></i><span slot="title"><router-link to="/tools"> 实用工具</router-link></span></el-menu-item><el-menu-item index="/admin/home" v-show="userinfo.username === 'admin'"><i class="iconfont icon-yonghu"></i><span slot="title"><router-link to="/admin/home"> 后台登录</router-link></span></el-menu-item></el-menu>
</template><script>
import { mapState } from "vuex";
export default {name: "Leftmenu",computed: {...mapState("loginModule", ["userinfo"]),},// mounted() {//   console.log(this.userinfo.username);// },methods: {handleOpen(key, keyPath) {console.log(key, keyPath);},handleClose(key, keyPath) {console.log(key, keyPath);},//element-ui导航菜单使用刷新后高亮显示不一致完美解决办法handleSelect(key, keyPath) {this.$router.push(key);},},
};
</script>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/89208.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营&#xff08;后端组&#xff09;的成员。本文由博主本人整理自该营的日常学习实践&#xff0c;首发于稀土掘金&#xff1a;&#x1f517;Go语言入门指南&#xff1a;基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

护眼灯买哪种好,2023护眼台灯推荐

护眼台灯的光照一般比较均匀&#xff0c;相比普通台灯&#xff0c;一般具有防蓝光、防频闪等功能&#xff0c;能够提供一个健康舒适的学习、生活灯光环境&#xff0c;建议选购内置智能感光模式的护眼台灯&#xff0c;以确保灯光亮度一直处于均衡状态&#xff0c;让眼睛更轻松。…

谷歌关闭跨域限制.(生成一个开发浏览器),Chrome关闭跨域

(一)、首先找到浏览器在电脑磁盘中的位置,并复制 (二)、复制一个浏览器的快捷方式到桌面(不影响正常浏览器) (三)、chrom鼠标右键属性&#xff0c;修改快捷方式的目标 &#xff08;四&#xff09;chrome.exe 后面添加 --disable-web-security --user-data-dir 复制的Chrome浏览…

SpringBoot复习(39)Servlet容器的自动配置原理

Servlet容器自动配置类为ServletWebServerFactoryAutoConfiguration 可以看到通过Import注解导入了三个配置类&#xff1a; 通过这个这三个配置类可以看出&#xff0c;它们都使用了ConditionalOnClass注解&#xff0c;当类路径存在tomcat相关的类时&#xff0c;会配置一个T…

Jmeter 配置环境变量,简明教程专享

通过给 JMeter 配置环境变量&#xff0c;可以快捷的打开 JMeter&#xff1a; 打开终端。执行 jmeter。 配置环境变量的方法如下。 Mac 和 Linux 系统 在 ~/.bashrc 中加如下内容&#xff1a; export JMETER_HOMEJMeter所在目录 export PATH$JAVA_HOME/bin:$PATH:.:$JMETER…

使用阿里云服务器部署和使用GitLab

本文阿里云百科分享使用阿里云服务器部署和使用GitLab&#xff0c;GitLab是Ruby开发的自托管的Git项目仓库&#xff0c;可通过Web界面访问公开的或者私人的项目。本教程介绍如何部署和使用GitLab。 目录 准备工作 部署GitLab环境 使用GitLab 登录GitLab 生成密钥对文件并…

Netty:在一个ByteBuf中寻找另外一个ByteBuf出现的位置

说明 利用ByteBufUtil的indexOf(ByteBuf needle, ByteBuf haystack)函数可以在haystack中寻找needle出现的位置。如果没有找到&#xff0c;返回-1。 示例 在一个ByteBuf 中找到了另外一个ByteBuf package com.thb;import io.netty.buffer.ByteBuf; import io.netty.buffer.…

CDN(内容分发网络)

CDN的全称是 Content Delivery Network, 即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络&#xff0c;依靠部署在各地的边缘服务器&#xff0c;通过中心平台的负载均衡、内容分发、调度等功能模块&#xff0c;使用户就近获取所需内容&#xff0c;降低网络拥塞&a…

图书馆管理系统、学生管理系统、交通管理系统(C语言、数据结构、java、Javaweb)

图书馆管理系统作为一个经典的项目&#xff0c;在国家、学校、等每个地方或者作为期末作品都用的非常广泛&#xff1a; C语言程序设计&#xff1a;图书馆管理系统含说明文档。 大一时C综合设计&#xff0c;当时得了96。代码纯原创&#xff0c;可直接运行&#xff0c;包含详细注…

nginx动态加载配置文件的方法

1. main函数调用ngx_get_options函数 2. ngx_get_options(int argc, char *const *argv)中会解析用户输入命令。 case ‘s’: if (*p) { ngx_signal (char *) p; } else if (argv[i]) {ngx_signal argv[i];} else {ngx_log_stderr(0, "option \"-s\" requi…

PHP流浪动物招领网站mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP流浪动物招领网站 是一套完善的web设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 下载链接 nullhttps://download.csdn.net/download/qq_41221322/88190168视频演示 …

Web服务器项目一

文章目录 是什么HTTP协议——应用层协议服务器基本框架两种高效的处理模式线程池 是什么 Web服务器是一个服务器软件程序&#xff0c;主要功能是通过HTTP协议与客户端&#xff08;通常是浏览器Browser)进行通信&#xff0c;来接收&#xff0c;存储&#xff0c;处理来自客户端的…

ROS入门-第 1 章 ROS概述与环境搭建

目录 第 1 章 ROS概述与环境搭建 1.1 ROS简介 1.1.1 ROS概念 1.1.2 ROS设计目标 1.1.3 ROS发展历程 1.3 ROS快速体验 1.3.1 HelloWorld实现简介 1.3.2 HelloWorld&#xff08;C版&#xff09; 步骤 1&#xff1a;创建工作空间 步骤 2&#xff1a;创建发布者节点 步骤…

8.10 用redis实现缓存功能和Spring Cache

什么是缓存? 缓存(Cache), 就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。 通过Redis来缓存数据&#xff0c;减少数据库查询操作; 逻辑 每个分类的菜品保存一份缓存数据 数据库菜品数据有变更时清理缓存数据 如何将商品数据缓存起…

DAY21

题目一 给定三个字符串str1、str2和aim&#xff0c; 如果aim包含且仅包含来自str1和str2的所有字符&#xff0c;而且在aim中属于str1的字符 之间保持原来在str1中的顺序&#xff0c;属于str2的字符之间保持原来在str2中的顺序&#xff0c;那么称aim是str1和str2的交错组成。实…

适配器模式:将不兼容的接口转换为可兼容的接口

适配器模式&#xff1a;将不兼容的接口转换为可兼容的接口 什么是适配器模式&#xff1f; 适配器模式是一种结构型设计模式&#xff0c;用于将一个类的接口转换为客户端所期望的另一个接口。它允许不兼容的类能够合作&#xff0c;使得原本由于接口不匹配而无法工作的类能够一…

IDEA常用设置与maven项目部署

目录 前言 一、Idea是什么 二、Idea的优点 三、Idea的常用设置 主题设置 设置鼠标悬浮提示 忽略大小写提示 自动导包 取消单行显示Tabs 设置字体 配置类文档注释信息模版 设置文件编码 设置自动编译 水平或者垂直显示代码 快捷方式改成eclipse 设置默认浏览器…

SCSS的基本用法

1、声明变量 $ 声明变量的符号 $ 下面这张图左半部分是scss的语法&#xff0c;右半部分是编译后的css。&#xff08;整篇文章皆是如此&#xff09; 2、默认变量 !default sass 的默认变量仅需要在值后面加上 !default 即可。 如果分配给变量的值后面添加了 !default 标志…

HDMI接口的PCB布局布线要求

高清多媒体接口&#xff08;High Definition Multimedia Interface&#xff09;&#xff0c;简称&#xff1a;HDMI&#xff0c;是一种全数字化视频和声音发送接口&#xff0c;可以发送未压缩的音频及视频信号。随着技术的不断提升&#xff0c;HDMI的传输速率也不断的提升&#…

Qt5开发视频播放器

一、播放器界面UI设计 控件对象名位置&#xff08;坐标点&#xff09;对象名称组件名称备注Widget(0, 0, 809, 572)WidgetQWidgetlabellabelQLabel播放窗口label_2label_2QLabelvoice_controlvoice_controlQSlider音量滑动条btn_openbtn_openQPushButton打开文件按钮label_4la…