5、搭建前端项目

5.1 使用vite + vue搭建

win + r 打开终端

切换到你想要搭建的盘

在这里插入图片描述

npm init vite@latest

跟着以下步骤取名即可

在这里插入图片描述

cd fullStackBlognpm installnpm run dev

默认在 http://localhost:5173/ 下启动了

在这里插入图片描述

5.2 用vscode打开项目并安装需要的插件

在这里插入图片描述

1、删除多余的 HelloWorld.vue 文件

2、安装需要的插件

网络请求我直接用fetch了,你需要用axios的话就执行以下命令安装,使用也很简单

npm i axios -S

安装Element-Plus并引入到入口文件 main.js (这里使用了全局引入,按需引入的参考官网,很简单)

安装element-plus/icons-vue图标

npm install @element-plus/icons-vue

全局引入

npm install element-plus --save

在main.js中引入:

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import App from './App.vue'
import * as ElementPlusIconsVue from '@element-plus/icons-vue'const app = createApp(App)app.use(ElementPlus)
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
}
app.mount('#app')

**按需引入需要装两个插件,然后在vite.config.js中配置(打开注释部分即可):

npm install -D unplugin-vue-components unplugin-auto-import unplugin-icons
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
// import AutoImport from 'unplugin-auto-import/vite'
// import Components from 'unplugin-vue-components/vite'
// import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'
// import Icons from 'unplugin-icons/vite'
// import IconsResolver from 'unplugin-icons/resolver'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),// AutoImport({//   resolvers: [//     ElementPlusResolver(),//     IconsResolver({//       prefix: 'Icon',//     })//   ],// }),// Components({//   resolvers: [//     ElementPlusResolver(),//     IconsResolver({//       enabledCollections: ['ep'],//     }),//   ],// }),// Icons({//   autoInstall: true,// }),],
})

在这里插入图片描述

安装tailwindcss并配置

执行以下命令安装tailwindcss和相应的插件

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

会生成 tailwind.config.js 和 postcss.config.js 文件即可

然后在assets文件夹下创建一个 tailwind.css 文件(名称可以自定义) 写上以下代码,并引入到入口文件main.js

// tailwind.config.js

/** @type {import('tailwindcss').Config} */
export default {content: ["./index.html","./src/**/*.{vue,js,ts,jsx,tsx}",],theme: {extend: {},},plugins: [],
}

在这里插入图片描述

// postcss.config.js

export default {plugins: {tailwindcss: {},autoprefixer: {},},
}

在这里插入图片描述

// tailwind.css文件

@tailwind base;
@tailwind components;
@tailwind utilities;

在这里插入图片描述

// main.js

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import './assets/css/tailwind.css'
import './style.css'
import App from './App.vue'const app = createApp(App)app.use(ElementPlus)
app.mount('#app')

在这里插入图片描述

3、在App.vue中验证element 与 tailwind 是否生效

// App.vue

<template><div><h4 class="text-3xl font-blod underline">demo</h4><el-button class="mt-24" type="primary">button</el-button></div>
</template><script setup>
</script><style scoped>
</style>

在这里插入图片描述

在这里插入图片描述

验证没问题!

5.3 页面布局

安装vue-router路由

npm install vue-router@4

在src目录下新建router文件夹,新建index.js路由文件

// router/index.js

import { createRouter, createWebHistory } from "vue-router";const route = [{path: '/',component: () => import('../views/blog/List.vue')},{path: '/add',component: () => import('../views/blog/Add.vue')}
]const router = createRouter({history: createWebHistory(),routes: [...route]
});export default router;

在这里插入图片描述

在src下新建views文件夹,在views下新建blog文件夹,在blog下新建List.vue 和 Add.vue 文件

// List.vue

<template><div>list</div>
</template><script setup></script><style scoped></style>

// Add.vue

<template><div>add</div>
</template><script setup></script><style scoped></style>

在这里插入图片描述

在main.js中引入路由并挂载

// main.js

import { createApp } from 'vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import './assets/css/tailwind.css'
import './style.css'
import App from './App.vue'
import router from './router'const app = createApp(App)app.use(router)
app.use(ElementPlus)
app.mount('#app')

在这里插入图片描述

在components下新建Header.vue Main.vue Footer.vue Nav.vue 并添加如下代码:
在这里插入图片描述

// Header.vue

<template><div><el-header class="h-16 p-4 header-wrapper"><el-row><el-col :span="12"><button class="button" data-text="Awesome" @click="goToHome"><span class="actual-text">&nbsp;blog&nbsp;</span><span aria-hidden="true" class="hover-text">&nbsp;blog&nbsp;</span></button></el-col><el-col :span="12" class="flex justify-end"><Nav /></el-col></el-row></el-header></div>
</template><script setup>
import Nav from './Nav.vue'</script><style scoped>
.header-wrapper{line-height: 64px;
}
</style><style scoped>
.button {margin: 0;height: auto;background: transparent;padding: 0;border: none;cursor: pointer;
}.button {--border-right: 6px;--text-stroke-color: #1da1f2;--animation-color: #1da1f2;--fs-size: 2em;letter-spacing: 3px;text-decoration: none;font-size: var(--fs-size);font-family: "Arial";position: relative;text-transform: uppercase;color: transparent;-webkit-text-stroke: 1px var(--text-stroke-color);
}.hover-text {position: absolute;box-sizing: border-box;content: attr(data-text);color: var(--animation-color);width: 0%;inset: 0;border-right: var(--border-right) solid var(--animation-color);overflow: hidden;transition: 0.5s;-webkit-text-stroke: 1px var(--animation-color);
}.button:hover .hover-text {width: 100%;filter: drop-shadow(0 0 23px var(--animation-color))
}
</style>

// Main.vue

<template><div><el-main class="flex justify-center items-center container"><RouterView /></el-main></div>
</template><script setup></script><style scoped>
.container {min-width: 100%;height: calc(100vh - 128px);
}
</style>

// Footer.vue

<template><div><el-footer class="h-16 flex justify-center items-center bg-black text-white">Footer</el-footer></div>
</template><script setup></script><style scoped></style>

// Nav.vue

<template><div class="button-container"><button class="button" @click="goHome">List</button><button class="button" @click="goAdd">Add</button>
</div></template><script setup>
import { useRouter } from 'vue-router'const router = useRouter()const goHome = () => {router.push({ path: '/' })
}const goAdd = () => {router.push({ path: '/add' })
}
</script><style scoped>
.button-container {display: flex;background-color: rgba(0, 73, 144);width: 250px;height: 40px;align-items: center;justify-content: space-around;border-radius: 10px;box-shadow: rgba(0, 0, 0, 0.35) 0px 5px 15px,rgba(0, 73, 144, 0.5) 5px 10px 15px;transition: all 0.5s;
}
.button-container:hover {width: 300px;transition: all 0.5s;
}.button {outline: 0 !important;border: 0 !important;width: 40px;height: 40px;border-radius: 50%;background-color: transparent;display: flex;align-items: center;justify-content: center;color: #fff;transition: all ease-in-out 0.3s;cursor: pointer;
}.button:hover {transform: translateY(-3px);
}.icon {font-size: 20px;
}</style>

// App.vue改造为以下结构

<template><div><Header></Header><Main></Main><Footer></Footer></div>
</template><script setup>
import Header from './components/Header.vue'
import Main from './components/Main.vue'
import Footer from './components/Footer.vue'</script><style scoped>
</style>

在这里插入图片描述

初步布局完成,页面如图:
在这里插入图片描述

5.4 新增博客页面 (前端部分)

页面使用了markdown语法,安装以下插件:

编写markdowm:mavon-editor

展示markdown:markdown-it、highlight.js

vue2下安装mavon-editor,vue3下安装mavon-editor@next

npm install mavon-editor@next markdown-it highlight.js  --save

// Add.vue

四个字段:

​ 标题:title

​ 作者: auth

​ 文档:mdoc

​ 创建时间:createtime

// markdowm 暂时对图片没做处理

<template><div class="add-wrapper"><div class="top-anonymous"><el-input v-model="title" placeholder="标题(选填)"></el-input><el-input class="mt-4" v-model="auth" placeholder="作者(选填)"></el-input></div><div class="bottom-anonymous"><mavon-editor class="h-full" :toolbars="markdownOption" v-model="mdoc" /></div><button class="mt-8 button_submit" @click="save"><div class="button_submit__int"><span class="button_submit__span">Submit</span></div></button></div>
</template><script setup>
import { ref } from 'vue'
import { ElNotification } from 'element-plus'
import { useRouter } from 'vue-router'
import { dayjs } from 'element-plus'
import { mavonEditor } from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'const router = useRouter()let mdoc = ref('')let markdownOption = ref({bold: true, // 粗体italic: true, // 斜体header: true, // 标题underline: true, // 下划线strikethrough: true, // 中划线mark: true, // 标记superscript: true, // 上角标subscript: true, // 下角标quote: true, // 引用ol: true, // 有序列表ul: true, // 无序列表link: true, // 链接imagelink: true, // 图片链接code: true, // codetable: true, // 表格fullscreen: false, // 全屏编辑readmodel: false, // 沉浸式阅读htmlcode: true, // 展示html源码help: true, // 帮助undo: true, // 上一步redo: true, // 下一步trash: true, // 清空save: true, // 保存(触发events中的save事件)navigation: true, // 导航目录alignleft: true, // 左对齐aligncenter: true, // 居中alignright: true, // 右对齐subfield: true, // 单双栏模式preview: true, // 预览
})let title = ref('')
let auth = ref('')const save = async () => {if (!mdoc.value) {ElNotification({message: '请录入内容~~',type: 'error'}) return}const params = {title: title.value || `标题--${dayjs().format('YYYY-MM-DD HH:mm:ss')}`,auth: auth.value || '恋爱单排选手',mdoc: mdoc.value,createtime: dayjs().format('YYYY-MM-DD HH:mm:ss')}const response = await request(params)console.log(response)if (!response.ok) {ElNotification({message: response.message,type: 'error'}) return}ElNotification({message: '写入成功~~',type: 'success'})router.push({ path: '/' })}const request = async (params) => {const url = `${import.meta.env.VITE_API_BASE_URL}/api/add`const response = await fetch(url, {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify(params)})return response
}</script><style scoped>
.add-wrapper {width: 90%;height: 96%;display: flex;flex-direction: column;justify-content: space-between;align-items: center;
}
.top-anonymous {width: 100%;
}
.bottom-anonymous {margin-top: 32px;width: 100%;height: 100%;
}</style><style scoped>
.button_submit {background-image: linear-gradient(to right bottom, #e300ff, #ff00aa, #ff5956, #ffb900, #fffe00);border: none;font-size: 1.2em;border-radius: 1.5em;padding: 4px;transition: border-top-left-radius 0.2s ease-in, border-top-right-radius 0.2s ease-in 0.15s, border-bottom-right-radius 0.2s ease-in 0.3s,border-bottom-left-radius 0.2s ease-in 0.45s, padding 0.2s ease-in;position: relative;
}.button_submit__int {background-color: #212121;color: white;border-radius: 1.3em;padding: 10px 40px;transition: all 0.2s ease-in,border-top-left-radius 0.2s ease-in, border-top-right-radius 0.2s ease-in 0.15s, border-bottom-right-radius 0.2s ease-in 0.3s,border-bottom-left-radius 0.2s ease-in 0.45s,padding 0.2s ease-in;font-weight: 600;z-index: -1;box-shadow: -15px -10px 30px -5px rgba(225, 0, 255, 0.8),15px -10px 30px -5px rgba(255, 0, 212, 0.8),15px 10px 30px -5px rgba(255, 174, 0, 0.8),-15px 10px 30px -5px rgba(255, 230, 0.8);
}.button_submit:active .button_submit__int {padding: 10px 30px;
}.button_submit:hover {border-radius: 0;
}.button_submit:hover .button_submit__int {border-radius: 0;
}.button_submit:hover .button_submit__int {box-shadow: -25px -10px 30px -5px rgba(225, 0, 255, 0.7),25px -10px 30px -5px rgba(255, 0, 212, 0.7),25px 10px 30px -5px rgba(255, 174, 0, 0.7),-25px 10px 30px -5px rgba(255, 230, 0, 0.7);
}</style>

在这里插入图片描述

5.4 列表页面展示(前端部分)

// List.vue 页面数据目前是伪造的,后面后端写完后直接调用

<template><div class="w-full h-full pt-10 box-border flex justify-between list-wrapper"><div class="w-3/5 h-full mr-4 relative left-wrapper"><div><inputclass="w-full bg-[#004990] text-white font-mono ring-1 ring-zinc-400 focus:ring-2 focus:ring-blue-400 outline-none duration-300 placeholder:text-white placeholder:opacity-50 rounded-full px-4 py-1 shadow-md focus:shadow-lg focus:shadow-blue-400"autocomplete="off"placeholder="title..."name="title"type="text"v-model="input"@blur="search"/></div><div class="mt-8 overflow-y-scroll blog-list"><div v-for="item in blogList" :key="item"><div class="text-3xl cursor-pointer" ><span class="hover:text-[#1da1f2]">{{ item.title }}</span></div><div class="flex flex-row my-4"><el-text class="basis-2/4" type="info"><el-icon><Position /></el-icon>{{ item.auth }}</el-text><el-text class="basis-2/4" type="info"><el-icon><Compass /></el-icon>{{ item.createtime }}</el-text></div><div class="mt-2 border rounded-md p-4"><div v-html="md.render(item.mdoc)"></div></div><el-divider /></div></div><el-pagination class="absolute bottom-0" :hide-on-single-page="isShowPage" background layout="prev, pager, next" :page-size="5":default-page-size="5" :current-page="currentPage" :total="totalNum" @current-change="currentChange" /></div><div class="w-2/5 h-full right-wrapper"><div class="h-24"></div><div class=""></div></div></div><div class="write-btn-wrapper" @click="goWrite"><WriteBtn /></div>
</template><script setup>
import { ref } from 'vue'
import WriteBtn from '../../components/WriteBtn.vue'
import markdownit from 'markdown-it'
import hljs from 'highlight.js/lib/core'
import 'highlight.js/styles/atom-one-dark.css'
import { useRouter } from 'vue-router'
const router = useRouter()const goWrite = () => {router.push({ path: '/add' })
}
let input = ref('')
let blogList = ref([{title: 'title1',auth: 'auth1',createtime: '2024-06-04',mdoc: '## 132\n```language\nlet a = 1 + 1\n```\n'},{title: 'title2',auth: 'auth2',createtime: '2024-06-04',mdoc: '## 这是一个测试2'},{title: 'title1',auth: 'auth1',createtime: '2024-06-04',mdoc: '## 132\n```language\nlet a = 1 + 1\n```\n'},{title: 'title1',auth: 'auth1',createtime: '2024-06-04',mdoc: '## 132\n```language\nlet a = 1 + 1\n```\n'},{title: 'title1',auth: 'auth1',createtime: '2024-06-04',mdoc: '## 132\n```language\nlet a = 1 + 1\n```\n'},{title: 'title1',auth: 'auth1',createtime: '2024-06-04',mdoc: '## 132\n```language\nlet a = 1 + 1\n```\n'},
])
let totalNum = ref(100)
let currentPage = ref(1)
// let isShowPage = computed(() => blogList.value.length <= 5)
let isShowPage = falseconst currentChange = async (page) => {currentPage.value = pageconsole.log(page, '=================')requestData()}const md = markdownit({html: true,linkify: true,typographer: true,breaks: true,highlight: function (str, lang) {if (lang && hljs.getLanguage(lang)) {try {return `<pre><code class="language-${lang} hljs">` +hljs.highlight(str, { language: lang, ignoreIllegals: true }).value +'</code></pre>';} catch (__) { }}return '<pre><code class="language-none hljs">' + md.utils.escapeHtml(str) + '</code></pre>';}
})const search = () => {requestData()
}const requestData = async () => {console.log(import.meta.env.VITE_API_BASE_URL, '============')const url = `${import.meta.env.VITE_API_BASE_URL}/api/list`console.log(input.value, '======input.value======')const params = {currentPage: currentPage.value - 1,title: input.value.trim()}const queryString = new URLSearchParams(params).toString();const requestUrl = `${url}?${queryString}`;const response = await fetch(requestUrl, {method: 'GET',headers: {'Content-Type': 'application/json'}})if (!response.ok) {throw new Error('Failed to fetch data')}const data = await response.json()// console.log('Data from backend:', data)const { data: resData, total } = datablogList.value = resDatatotalNum.value = total
}</script><style scoped>
.write-btn-wrapper {position: fixed;top: 120px;right: 40px;
}
.blog-list {height: 90%;
}</style>

在这里插入图片描述

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

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

相关文章

【Vue3】理解toRef() 和 toRefs()

历史小剧场 知道可能面对的困难和痛苦&#xff0c;在死亡的恐惧中不断挣扎&#xff0c;却仍然能战胜自己&#xff0c;选择这条道路&#xff0c;这才是真正的勇气。----《明朝那些事儿》 前言 toRef 和 toRefs 是Vue3中的响应式转换工具函数 toRef: 不影响源对象的情况下&#x…

【数据结构】AVLTree实现详解

目录 一.什么是AVLTree 二.AVLTree的实现 1.树结点的定义 2.类的定义 3.插入结点 ①按二叉搜索树规则插入结点 ②更新平衡因子 更新平衡因子情况分析 ③判断是否要旋转 左单旋 右单旋 左右单旋 右左双旋 4.删除、查找和修改函数 查找结点 三.测试 1.判断是否是搜索树 …

面试题-Vue2和Vue3的区别

文章目录 1. 响应式系统2. 组合式 API (Composition API)3. Fragment (碎片)4. Teleport (传送门) 5. 性能改进6. 移除或改变的功能7. 构建工具8. TypeScript 支持 Vue 2 和 Vue 3 之间存在许多重要的区别&#xff0c;这些区别涵盖了性能、API 设计、组合式 API&#xff08;Com…

AndroidStudio无法识别连接夜神模拟器

方法一(无法从根本上解决) ①进入夜神模拟器安装路径下的bin路径(安装路径可以带有中文路径) ②打开cmd窗口,输入以下代码(一定要打开模拟器) nox_adb.exe connect 127.0.0.1:62001 方法二(根本上解决) 原因:Android Studio的adb版本与夜神模拟器的adb版本不一致 ①打开And…

技术架构的发展

技术架构的演进 主要方向&#xff1a; ​ 1.提高单位时间内的吞吐量&#xff0c;提高并发度&#xff1b; ​ 2.对应用服务代码进行解耦合&#xff0c;使得开发效率得到提高&#xff1b; ​ 3.运维成本降低&#xff1b; ​ 4.成本降低&#xff0c;如购买云厂商资源&#xf…

Cortex-M7——NVIC

Cortex-M7——NVIC 小狼http://blog.csdn.net/xiaolangyangyang 一、NVIC架构 二、中断及异常编号 三、中断屏蔽寄存器&#xff08;__disable_irq和__enable_irq操作的是PRIMASK寄存器&#xff09; 四、中断分组寄存器&#xff08;SCB->AIRCR[10:8]&#xff09; 五、NVIC寄…

常用的Linux命令,linux下文件的读、写、打开、关闭append用法

vim demoq.c打开写的.c文件 内容为 按a可以编辑页面代码。按ESC退出编辑然后按shift&#xff1a;wq保存文件并退出 Linux 系统中采用三位十进制数表示权限&#xff0c;如0755&#xff0c; 0644.7 124(可读、可写、可执行&#xff09; 5 14(可读、不可写、可执行&#xff09; …

苹果手机微信如何直接打印文件

在快节奏的工作和生活中&#xff0c;打印文件的需求无处不在。但你是否曾经遇到过这样的困扰&#xff1a;打印店价格高昂&#xff0c;让你望而却步&#xff1f;今天&#xff0c;我要给大家介绍一款神奇的微信小程序——琢贝云打印&#xff0c;让你的苹果手机微信直接变身移动打…

Docker配置Redis集群以及主从扩容与缩容

基础镜像拉取 docker run -p 6379:6379 -d redis:6.0.8 配置文件以及数据卷挂载 # 开启密码验证&#xff08;可选&#xff09; requirepass 1234 # 允许redis外地连接&#xff0c;需要注释掉绑定的IP # bind 127.0.0.1 # 关闭保护模式&#xff08;可选&#xff09; protected-m…

6.18云服务器大促盘点,错过一次,再等一年!

随着云计算技术的飞速发展&#xff0c;云服务器已成为企业和个人构建和扩展在线业务的首选平台。特别是在大型促销活动如618年中大促期间&#xff0c;云服务提供商纷纷推出极具吸引力的优惠&#xff0c;以降低用户上云的门槛。以下是对当前市场上几个主流云服务提供商的优惠活动…

德克萨斯大学奥斯汀分校自然语言处理硕士课程汉化版(第六周) - 预训练模型

预训练模型 1. 预训练模型介绍 1.1. ELMo1.2. GPT1.3. BERT 2. Seq2Seq 2.1. T52.2. BART 3. Tokenization 1. 预训练模型介绍 在预训练语言模型出现之前&#xff0c;统计语言模型&#xff08;如N-gram模型&#xff09;是主流方法。这些模型利用统计方法来预测文本中的下一个…

设计模式-外观(门面)模式(结构型)

外观模式 外观模式又称门面模式&#xff08;结构型模式&#xff09;&#xff0c;它是一个可以屏蔽系统复杂性的设计模式。俗话说没有什么问题是加一层“介质”解决不了的&#xff0c;如果有那就在加一层。在开发过程中肯定封装过Utils类&#xff0c;我认为这就是一种门面模式&…

亘古真知

目录 一&#xff0c;概述 二&#xff0c;个人面板 三&#xff0c;科技面板 四&#xff0c;手牌 五&#xff0c;回合 1&#xff0c;行动 &#xff08;1&#xff09;打造 &#xff08;2&#xff09;学习 &#xff08;3&#xff09;归档 &#xff08;4&#xff09;挖掘 …

Java——数组排序和查找

一、排序介绍 1、排序的概念 排序是将多个数据按照指定的顺序进行排列的过程。 2、排序的种类 排序可以分为两大类&#xff1a;内部排序和外部排序。 3、内部排序和外部排序 1&#xff09;内部排序 内部排序是指数据在内存中进行排序&#xff0c;适用于数据量较小的情况…

【SQLAlChemy】如何连接数据库?

使用SQLAlChemy连接数据库 导入包 首先&#xff0c;导入创建数据库引擎的包。 from sqlalchemy import create_engine编写数据库配置 SQLALCHEMY_DATABASE_URL "mysql://root:123456789127.0.0.1:3306/tortoise"字段解释&#xff1a; mysql:&#xff1a;这是数…

持续警惕火灾风险:学校可燃气体报警器的定期校准检验

可燃气体报警器在学校中的安装、检验和校准对于保护师生生命安全至关重要。 接下来&#xff0c;佰德将探讨可燃气体报警器在学校中的必要性&#xff0c;以及相关实际案例和数据&#xff0c;为您呈现一个安全的学习环境。 一、学校安全不能掉以轻心 学校是培养未来的摇篮&…

【CS.SE】端午节特辑:Docker容器化技术详解与实战

端午节, 先祝愿大家端午安康&#xff0c;阖家幸福, 哈哈&#xff01;这篇讲下Docker这一现代软件开发中不可或缺的技术。软件工程涉及软件开发的整个生命周期&#xff0c;包括需求分析、设计、构建、测试、部署和维护。Docker作为一种容器化技术&#xff0c;直接关联到软件部署…

云服务器CPU和内存直接被zzh恶意挖矿程序打满,如何解决?

回顾 最近在服务器上面部署网站&#xff0c;刚开始使用还是没问题的&#xff0c;当时一段时间之后发现CPU和内存总是被打满&#xff0c;本地没有跑大的应用&#xff0c;主要有mysql、nginx、redis&#xff0c;一度还以为是nginx 的问题&#xff0c;但是后来排除了。之后使用ht…

Android 11 低电量自动关机失效

Android 11 低电量自动关机 概述 安卓系统设计了低电关机功能&#xff0c;旨在当手机电池电量过低时自动关机&#xff0c;以保护手机硬件和数据安全。该功能由以下几个部分组成&#xff1a; 电池电量监测: 安卓系统通过 BatteryService 组件持续监测电池电量。BatteryService…

小主机折腾记24

好久不更新&#xff0c;最近折腾的事如下 1.10块钱自提买了个半高机箱&#xff0c;15086140&#xff0c;把之前拆机的H61m-A/M32AA/DP_MB与200w航嘉电源装了进去&#xff0c;额外买了半高pcie转接了个m2位&#xff0c;江波龙64g安装了win10专业版&#xff0c;最后卖了176块钱&a…