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

news2024/11/23 15:26:49

前端部分:

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中获取token
	let 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是否存在,如果存在说明需要更新token
		Storage.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.token
        if (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-input
          type="text"
          v-model="loginForm.username"
          autocomplete="off"
        ></el-input>
      </el-form-item>
      <el-form-item label="密码" prop="password">
        <el-input
          type="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-input
          placeholder="请输入内容"
          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>
    <transition
      appear
      name="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.coloradmin.cn/o/761268.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数学专题训练2 组合计数

1. 硬币购物 4 种面值的硬币&#xff0c;第 i 种的面值是 C i C_i Ci​​。 n n n​ 次询问&#xff0c;每次询问给出每种硬币的数量 D i D_i Di​​ 和一个价格 S S S​&#xff0c;问付款方式。 n ≤ 1 0 3 , S ≤ 1 0 5 n\leq 10^3,S\leq 10^5 n≤103,S≤105​. 如果用…

第一百零九天学习记录:C++实战:职工管理系统(黑马教学视频)

1、管理系统需求 代码进入一个 while 循环&#xff0c;不断从文件流 ifs 中读取数据。循环的条件是 ifs 从文件中读取 id、name 和 dId 三个值的操作都成功。如果读取成功&#xff0c;循环内部的代码块会执行一次&#xff0c; num 的值加一。 这段代码的作用是从文件中逐行读取…

ENSP路由器的基本命令操作(第十六课)

ENSP路由器的基本命令操作(第十六课) 1-1 代码重点回顾 1 ipconfig 查看 pc机的IP地址2 ping 连接的IP地址3 system-view 进入系统视图4 [Huawei]interface GigabitEthernet 0/0/1 进入接口视图 过0/0/15 quit 返回上一层视图6 ctrlZ 快速返回用户视图7 [sy]sysna…

【V8】【2. 内联函数、Slot】

什么是内联函数 在 V8 执行函数的过程中&#xff0c;会观察函数中一些调用点 (CallSite) 上的关键的中间数据&#xff0c;然后将这些数据缓存起来&#xff0c;当下次再次执行该函数的时候&#xff0c;V8 就可以直接利用这些中间数据&#xff0c;节省了再次获取这些数据的过程&…

PS图层混合模式超详细解答-图层混合模式的原理(Part2)

对比度组 叠加Overlay 此模式是正片叠底和滤色的组合&#xff0c;组合依据是底图的中性灰平面&#xff0c;如果在 [ 0 , 128 ] [0,128] [0,128]则使用正片叠底&#xff0c;若是在 ( 128 , 255 ] (128,255] (128,255]之间&#xff0c;则是实用滤色。 公式 r O v e r L a y (…

专项练习29

目录 一、选择题 1、如果修改obj里面的name属性时会发生什么&#xff1f; 2、以下代码执行后&#xff0c;a.x 和 b.x 的结果分别为&#xff08;&#xff09; 3、在ECMAScript6 中,Promise的状态有&#xff08;&#xff09; 4、下面哪些方式在同一个窗口下能够检测一个js对象是…

解决:eclipse无法查看源代码

eclipse的jdk没有配置对应的src&#xff0c;需要手动去添加jdk的源代码附件。 步骤如下&#xff1a; 1、找到以下路径&#xff1a;windows(窗口)–>Preferences(首选项)–>Java–>Installed JRES(已安装的JRE)&#xff0c;出现如下图所示的图片后&#xff0c;选中点…

15 - 信号处理设计模式

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. Linux应用程序安全性讨论1.1 问题1.2 不同场景1.2.1 场景一&#xff1a;不需要处理信号1.2.2 场景二&#xff1a;需要处理信号 2. 场景…

SQLmap使用指南(包含使用SQLmap获取shell)

文章标题 一&#xff1a;SQLmap基础知识二&#xff1a;SQLmap各大模块中的常用命令&#xff08;一&#xff09; 基础命令&#xff08;二&#xff09; target模块&#xff08;三&#xff09; Emuneration模块&#xff08;四&#xff09;其他命令 三&#xff1a;SQLmap应用示例&a…

数据结构_进阶(2):二叉树的OJ练习题

目录 1. 二叉树创建字符串。OJ链接 2. 二叉树的分层遍历1。OJ链接 3. 二叉树的分层遍历2。OJ链接 4. 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先 。OJ链接 5. 二叉树搜索树转换成排序双向链表。OJ链接 6. 根据一棵树的前序遍历与中序遍历构造二叉树。 OJ链接…

2023年NOC决赛-加码未来编程赛项决赛模拟题-Python模拟题--卷4

第一题、计算 1+2+3+⋯+(n−1)+n 的值,其中正整数 n 不大于 100。由于你没有高斯聪明,所以你不被允许使用等差数列求和公式直接求出答案。 输入格式 输入一个正整数 n。 输出格式 输出一个正整数,表示最后求和的答案。 输入输出样例 输入 #1 100 输出 #1 5050 第二…

手撕自定义类型:结构体,枚举,联合——【C语言】

在开始学习之前我们先来欣赏一下五岳之一华山的风景&#xff0c;来营造一个好心情&#xff0c;只有一个好心情我们才能更好的学习 目录 结构体 1 结构体的声明 1.1 结构的基础知识 1.2 结构的声明 1.3 特殊的声明 1.4 结构的自引用 1.5 结构体变量的定义和初始化 1.6 …

Go语言之重要数组类型切片(slice)make,append函数

切片是一个动态数组&#xff0c;因为数组的长度是固定的&#xff0c;所以操作起来很不方便&#xff0c;比如一个names数组&#xff0c;我想增加一个学生姓名都没有办法&#xff0c;十分不灵活。所以在开发中数组并不常用&#xff0c;切片类型才是大量使用的。 切片基本操作 切片…

Linux系统文件编程及文件读、写操作

Linux 系统编程Day01 文章目录 Linux 系统编程Day011.文件编程概述1.1 文件的打开及创建1.1.1 参数说明1.1.2 文件写入操作示例1.1.3 文件的权限 2.文件操作2.1 写入文件2.2 文件读取操作2.3 文件的光标移动操作 3.文件操作原理简述3.1文件描述符3.2 Linux文件操作流程 1.文件编…

【数据结构】二叉树的前中后序遍历(C语言)

文章目录 什么是二叉树树相关的概念树的表示形式特殊的二叉树如何创造出一棵二叉树二叉树的遍历先序遍历(前序遍历)中序遍历后序遍历 总结 什么是二叉树 [二叉树] 顾名思义就是有两个分支节点的树&#xff0c;不仅如此&#xff0c;除了叶子外的所有节点都具有两个分支节点&…

单个电源模块给多个负载使用,并且电源后还经过了磁珠-二级电源直流压降仿真

单个电源模块给多个负载使用,并且电源后还经过了磁珠-二级电源直流压降仿真 下面介绍单个电源模块给多个负载使用,并且电源后还经过了磁珠-二级电源直流压降仿真,常见于二级压降仿真,以下图为例

备战秋招 | 笔试强训5

目录 一、选择题 二、编程题 三、选择题题解 四、编程题题解 一、选择题 1、在上下文和头文件均正常情况下&#xff0c;以下程序的输出结果是&#xff08;&#xff09; int x 1; do {printf("%2d\n",x); }while(x--); A. 1 B. 无任何输出 C. 2 D. 陷入死循环 …

三种智能算法优化PID参数软件,MATLABAPP开发

今天的主题是&#xff1a;三种智能算法优化常见传递函数的PID参数&#xff0c;采用MATLAB APP Designer 开发。提供代码源程序&#xff0c;可以自行修改源代码&#xff08;不是封装软件&#xff09; 这个软件基本涵盖了所有的传递函数类型&#xff0c;传递函数的参数简单易改。…

【Java反射机制详解】—— 每天一点小知识

&#x1f4a7; J a v a 反射机制详解 \color{#FF1493}{Java反射机制详解} Java反射机制详解&#x1f4a7; &#x1f337; 仰望天空&#xff0c;妳我亦是行人.✨ &#x1f984; 个人主页——微风撞见云的博客&#x1f390; &#x1f433; 《数据结构与算法》专栏的文章…

pytest 参数化进阶

目录 前言&#xff1a; 语法 参数化误区 实践 简要回顾 前言&#xff1a; pytest是一个功能强大的Python测试框架&#xff0c;它提供了参数化功能&#xff0c;可以帮助简化测试用例的编写和管理。 语法 本文就赶紧聊一聊 pytest 的参数化是怎么玩的。 pytest.mark.par…