AJAX项目——数据管理平台
黑马程序员视频地址:
黑马程序员——数据管理平台
前言
功能:
1.登录和权限判断
2.查看文章内容列表(筛选,分页)
3.编辑文章(数据回显)
4.删除文章
5.发布文章(图片上传,富文本编辑器)
技术:
1.基于Bootstrap 搭建网站标签和样式
2.集成wangEditor 插件实现富文本编辑器
3.使用原生JS 完成增删改查等业务
4.基于axios 与黑马头条线上接口交互
5.使用axios 拦截器进行权限判断
项目准备:
准备配套的素材代码
包含:html,css,js,静态图片,第三方插件等等数据管理平台模板代码.zip文件大小:13.5 M|https://user-a001.lanzouv.com/ijtSu2mp9i9ghttps://user-a001.lanzouv.com/ijtSu2mp9i9ghttps://user-a001.lanzouv.com/ijtSu2mp9i9ghttps://user-a001.lanzouv.com/ijtSu2mp9i9ghttps://user-a001.lanzouv.com/ijtSu2mp9i9ghttps://user-a001.lanzouv.com/ijtSu2mp9i9g
https://user-a001.lanzouv.com/ijtSu2mp9i9g
接口文档:
欢迎使用 - B站-AJAX和黑马头条-数据管理平台
目录管理:
• assets:资源文件夹(图片,字体等)
• lib:资料文件夹(第三方插件,例如:form-serialize)
• page:页面文件夹
• utils:实用程序文件夹(工具插件)
验证码登录
1.在utils/request.js中配置基地址
// axios 公共配置
// 基地址
axios.defaults.baseURL = "http://geek.itheima.net"
2.登录按钮代码
document.querySelector(".btn").addEventListener("click", () => {const form = document.querySelector(".login-form")const data = serialize(form, {hash: true, empty: true})axios({url: "/v1_0/authorizations",method: "POST",data}).then(result => {myAlert(true, "登录成功!")}).catch(error => {myAlert(false, error.response.data.message)})
})
token
token 的介绍

token 的使用
1. 在utils/auth.js 中判断无 token 令牌字符串,则强制跳转到登录页(手动修改地址栏测试)
/*** 目标1:访问权限控制* 1.1 判断无 token 令牌字符串,则强制跳转到登录页* 1.2 登录成功后,保存 token 令牌字符串到本地,并跳转到内容列表页面*/
const token = localStorage.getItem("token")
if(!token)
{alert("请先登录!")setTimeout(() => {location.href = "../login/index.html"}, 1500)
}
2. 在登录成功后,保存token 令牌字符串到本地,再跳转到首页(手动修改地址栏测试)
then(result => {//存入tokenlocalStorage.setItem("token", result.data.data.token)//提示框myAlert(true, "登录成功!")//1.5s后跳转新页面setTimeout(() => {location.href = "../content/index.html"}, 1500)})
axios 请求拦截器和个人信息设置
1. 什么是axios 请求拦截器?
✓ 发起请求之前,调用的一个函数,对请求参数进行设置
2. axios 请求拦截器,什么时候使用?
✓ 有公共配置和设置时,统一设置在请求拦截器中
官方文档:
拦截器 | Axios中文文档 | Axios中文网https://www.axios-http.cn/docs/interceptorshttps://www.axios-http.cn/docs/interceptorshttps://www.axios-http.cn/docs/interceptorshttps://www.axios-http.cn/docs/interceptorshttps://www.axios-http.cn/docs/interceptorshttps://www.axios-http.cn/docs/interceptors
https://www.axios-http.cn/docs/interceptors
1.在utils/request.js文件中配置
// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么const token = localStorage.getItem("token")token && (config.headers.Authorization = `Bearer ${token}`)return config
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
})
2.在utils/auth.js 中请求个人信息并设置到页面
/*** 目标2:设置个人信息* 2.1 在 utils/request.js 设置请求拦截器,统一携带 token* 2.2 请求个人信息并设置到页面*/
axios({url: "/v1_0/user/profile"
}).then(result => {const username = result.data.data.namedocument.querySelector(".nick-name").innerText = username
}).catch(error => {console.log(error)
})
axios 响应拦截器和身份验证失败
1. 什么是axios 响应拦截器?
✓ 响应回到then/catch 之前,触发的拦截函数,对响应结果统一处理
2. axios 响应拦截器,什么时候触发成功/失败的回调函数?
✓ 状态为2xx触发成功回调,其他则触发失败的回调函数
// 添加响应拦截器
axios.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么response = response.data //⭐️数据优化,得到的response是服务器数据+axios修饰后的代码,//而response.data是服务器返回的数据,将服务器返回的数据直接返回给then中//如上文代码中的result.data.data.name,如果此处返回response,则调用result.data.data.name//如果此处返回response.data,则调用result.data.namereturn response //⭐️response会传进.then(result => {})中,由result接收
}, function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么⭐️if(error?.response?.status === 401){alert("身份验证过期,请重新登录!")localStorage.clear()location.href = "../login/index.html"}return Promise.reject(error) //⭐️error会传进.catch(error => {})中,由error接收
})
发布文章
富文本编辑器
官方手册:
wangEditor 5https://www.wangeditor.com/v5/getting-started.htmlhttps://www.wangeditor.com/v5/getting-started.htmlhttps://www.wangeditor.com/v5/getting-started.htmlhttps://www.wangeditor.com/v5/getting-started.htmlhttps://www.wangeditor.com/v5/getting-started.htmlhttps://www.wangeditor.com/v5/getting-started.html
https://www.wangeditor.com/v5/getting-started.html手册中有完整步骤
1.引入CSS:在相应页面(publish/index.css)引入CSS
/* 富文本编辑器 */
#editor—wrapper {border: 1px solid #ccc;z-index: 100; /* 按需定义 */}#toolbar-container {border-bottom: 1px solid #ccc;}#editor-container {height: 500px;}
2.定义HTML:在需要部署的页面(publish/index.html)放置HTML代码
<!-- 富文本编辑器位置 -->
<div id="editor—wrapper"><div id="toolbar-container"><!-- 工具栏 --></div><div id="editor-container"><!-- 编辑器 --></div>
</div>
<!-- 记录富文本内容-用于表单收集 -->
<textarea name="content" class="publish-content" hidden></textarea>
3.引入 JS 创建编辑器:在utils/editor.js中放入代码
// 富文本编辑器
// 创建编辑器函数,创建工具栏函数
const { createEditor, createToolbar } = window.wangEditor// 编辑器配置对象
const editorConfig = {// 占位提示文字placeholder: '发布文章内容...',// 编辑器变化时回调函数onChange(editor) {// 获取富文本内容const html = editor.getHtml()// 也可以同步到 <textarea>// 为了后续快速收集整个表单内容做铺垫document.querySelector('.publish-content').value = html}
}// 创建编辑器
const editor = createEditor({// 创建位置selector: '#editor-container',// 默认内容html: '<p><br></p>',// 配置项config: editorConfig,// 配置集成模式(default 全部)(simple 简洁)mode: 'default', // or 'simple'
})// 工具栏配置对象
const toolbarConfig = {}// 创建工具栏
const toolbar = createToolbar({// 为指定编辑器创建工具栏editor,// 工具栏创建的位置selector: '#toolbar-container',// 工具栏配置对象config: toolbarConfig,// 配置集成模式mode: 'default', // or 'simple'
})
4.引入文件:在publish/index.html中引入script(黑马程序员已经帮我们引入过了)
<!--引入 CSS 定义样式-->
<linkhref="https://unpkg.com/@wangeditor/editor@latest/dist/css/style.css"rel="stylesheet"
/><!--引入 JS 创建编辑器-->
<script src="https://unpkg.com/@wangeditor/editor@latest/dist/index.js"></script>
频道列表
目标1:设置频道下拉菜单
1.1 获取频道列表数据
1.2 展示到下拉菜单中
//publish/index.jsasync function getChannels()
{//请求数据const channelsData = await axios({url: "/v1_0/channels"})//拼接数据const channelsHTML = `<option value="" selected="">请选择文章频道</option>` + channelsData.data.data.channels.map(item => `<option value="${item.id}" >${item.name}</option>`).join("")//渲染数据document.querySelector(".form-select").innerHTML = channelsHTML
}
getChannels()
封面设置
目标2:文章封面设置
2.1 准备标签结构和样式
2.2 选择文件并保存在 FormData
2.3 单独上传图片并得到图片 URL 网址
2.4 回显并切换 img 标签展示(隐藏 + 号上传标签)
document.querySelector(".img-file").addEventListener("change", async e => {//获取本地上传照片数据const file = e.target.files[0]//实例化表单对象const fd = new FormData()//添加image属性,并放入图片数据fd.append("image", file)//上传数据,返回照片地址const res = await axios({url: "/v1_0/upload",method: "POST",data: fd})const imgUrl = res.data.data.url//渲染到本地document.querySelector(".rounded").src = imgUrl //照片回显document.querySelector(".rounded").classList.add("show") //显示照片盒子document.querySelector(".place").classList.add("hide") //隐藏加号盒子
})//⭐️点击图片,模拟点击上传图片按钮,从而再次调用代码
document.querySelector(".rounded").addEventListener("click", () => {document.querySelector(".img-file").click()
})
收集并保存
目标3:发布文章保存
3.1 基于 form-serialize 插件收集表单数据对象
3.2 基于 axios 提交到服务器保存
3.3 调用 Alert 警告框反馈结果给用户
3.4 重置表单并跳转到列表页
document.querySelector(".send").addEventListener("click", async e => {//⭐️编辑功能留空1//获取表单const form = document.querySelector(".art-form")//获取表单数据const data = serialize(form, {hash: true, empty: true})//⭐️删除id字段数据delete data.id//获取图片数据data.cover = {type: 1, images: [document.querySelector(".rounded").src]}//上传数据try{const result = await axios({url: "/v1_0/mp/articles",method: "POST", data})//调用 Alert 警告框反馈结果给用户myAlert(true, "发布成功!")//清除表单form.reset()//清除图片document.querySelector(".rounded").src = `` //清除图片数据document.querySelector(".rounded").classList.remove("show") //隐藏照片盒子document.querySelector(".place").classList.remove("hide") //显示加号盒子//⭐️清除富文本框内容editor.setHtml('')//跳转文章列表页面setTimeout(() => {location.href = "../content/index.html"}, 1500)}catch(error){//调用 Alert 警告框反馈结果给用户myAlert(false, error.response.data.message)}})
内容管理
文章列表展示
目标1:获取文章列表并展示
1.1 准备查询参数对象
1.2 获取文章列表数据
1.3 展示到指定的标签结构中
标⭐️为代码留空区域,在对应功能模块编写时会添加
// 1.准备查询参数对象
const queryObj = {status: '', // 文章状态(1-待审核,2-审核通过)空字符串-全部channel_id: '', // 文章频道 id,空字符串-全部page: 1, // 当前页码per_page: 10 // 当前页面条数
}//⭐️分页功能留空1async function getArtileList() {//2.获取文章列表数据const res = await axios({url: '/v1_0/mp/articles',params: queryObj})//3.展示到指定的标签结构中const htmlStr = res.data.data.results.map(item => `<tr><td><img src="${item.cover.type === 0 ? `https://img2.baidu.com/it/u=2640406343,1419332367&fm=253&fmt=auto&app=138&f=JPEG?w=708&h=500`: item.cover.images[0]}" alt=""></td><td>${item.title}</td><td>${item.status === 1 ? `<span class="badge text-bg-primary">待审核</span>` : `<span class="badge text-bg-success">审核通过</span>`}</td><td><span>${item.pubdate}</span></td><td><span>${item.read_count}</span></td><td><span>${item.comment_count}</span></td><td><span>${item.like_count}</span></td><td "⭐️删除功能留空1"><i class="bi bi-pencil-square edit"></i><i class="bi bi-trash3 del"></i></td>
</tr>`).join('')document.querySelector('.art-list').innerHTML = htmlStr//⭐️分页功能留空2}
getArtileList()
筛选功能
目标2:筛选文章列表
2.1 设置频道列表数据
2.2 监听筛选条件改变,保存查询信息到查询参数对象
2.3 点击筛选时,传递查询参数对象到服务器
2.4 获取匹配数据,覆盖到页面展示
//1.设置频道列表数据
async function getChannels()
{//请求数据const channelsData = await axios({url: "/v1_0/channels"})//拼接数据const channelsHTML = `<option value="" selected="">请选择文章频道</option>` + channelsData.data.data.channels.map(item => `<option value="${item.id}" >${item.name}</option>`).join("")//渲染数据document.querySelector(".form-select").innerHTML = channelsHTML
}
getChannels()//2.监听筛选条件改变,保存查询信息到查询参数对象
//状态
document.querySelectorAll(".form-check").forEach(item => {item.addEventListener("change", e => {queryObj.status = e.target.value})
})//频道
document.querySelector(".form-select").addEventListener("change", e => {queryObj.channel_id = e.target.value
})
//3.点击筛选时,传递查询参数对象到服务器,并获取匹配数据,覆盖到页面展示
document.querySelector(".sel-btn").addEventListener("click", () => {getArtileList()
})
分页功能
目标3:分页功能
3.1 保存并设置文章总条数
3.2 点击下一页,做临界值判断,并切换页码参数并请求最新数据
3.3 点击上一页,做临界值判断,并切换页码参数并请求最新数据
//————————————————————————1.代码写在文章列表展示中——————————————————————————————//1.1保存文章总条数(对应留空1)let totalCount = 0 //1.2获取文章总条数(对应留空2)totalCount = res.data.total_countdocument.querySelector('.total-count').innerHTML = `共 ${totalCount} 条`
//————————————————————————————————————————————————————————————————————————————//2.点击下一页
document.querySelector(".next").addEventListener("click", () => {//判断是否可以进行下一页:当前页码小于总页码(总页码=(总条数/每一页最大条数)向上取整)if(queryObj.page < Math.ceil(totalCount / queryObj.per_page)){ //页码自增queryObj.page++ //页面显示当前页码document.querySelector(".page-now").innerHTML = `第 ${queryObj.page} 页` //更新数据getArtileList() }
})//3.点击上一页
document.querySelector('.last').addEventListener('click', e => {// 大于 1 的时候,才能翻到上一页if (queryObj.page > 1) {//页码自减queryObj.page--//页面显示当前页码document.querySelector('.page-now').innerHTML = `第 ${queryObj.page} 页`//更新数据getArtileList()}
})
删除功能
目标4:删除功能
4.1 关联文章 id 到删除图标
4.2 点击删除时,获取文章 id
4.3 调用删除接口,传递文章 id 到服务器
4.4 删除最后一页的最后一条,需要自动向前翻页
4.5 重新获取文章列表,并覆盖展示
//————————————————————————1.关联文章 id————————————————————————//留空1补自定义属性data-id="${item.id}"//——————————————————————————————————————————————————————————————————————
//2.点击删除时,获取文章 id
document.querySelector(".art-list").addEventListener("click", async e => {if(e.target.classList.contains("del")){//2.获取idconst delId = e.target.parentNode.dataset.id//3.调用删除接口,传递文章 id 到服务器const res = await axios({url: `/v1_0/mp/articles/${delId}`,method: "DELETE"})//4.删除最后一页的最后一条,需要自动向前翻页//获取子元素数组const children = document.querySelector(".art-list").children//判断子元素数组长度等于1并且当前页码数不等于1if(children.length === 1 && queryObj.page !== 1){//页码自减queryObj.page--//页面显示当前页码document.querySelector('.page-now').innerHTML = `第 ${queryObj.page} 页`}//5.重新获取并渲染数据getArtileList()}
})
编辑功能
回显文章
目标4:编辑-回显文章
4.1 页面跳转传参(URL 查询参数方式)
4.2 发布文章页面接收参数判断(共用同一套表单)
4.3 修改标题和按钮文字
4.4 获取文章详情数据并回显表单
//content/index.js//1.点击编辑时,获取文章 id,跳转到发布文章页面传递文章 id 过去
document.querySelector(".art-list").addEventListener("click", e => {//判断是否点击编辑按钮if(e.target.classList.contains("edit")){//获取idconst editId = e.target.parentNode.dataset.id//跳转到发布页面,并传递idlocation.href = `../publish/index.html?id=${editId}`}})
//publish/index.js
//使用立即执行函数(IIFE)创建一个独立的作用域,避免变量污染全局作用域
;(function(){//⭐️获取网页中携带的参数const paramsStr = location.search//⭐️实例化内置对象(用来处理?后面内容的对象)const params = new URLSearchParams(paramsStr)params.forEach(async (value, key) => {//判断是否含有id参数if(key === "id"){//修改页面文字document.querySelector(".title span").innerHTML = "修改文章"document.querySelector(".send").innerHTML = "修改"//获取文章详情const res = await axios({url: `/v1_0/mp/articles/${value}`})//整理需要用的值//方法一:解构// const {channel_id, title, cover:{images:[image]}, content, id} = res.data.data//方法二:创立新对象挨个赋值(本篇选择此方法)const dataObj = {channel_id: res.data.data.channel_id,title: res.data.data.title,image: res.data.data.cover.images[0],content: res.data.data.content,id: res.data.data.id}console.log(dataObj)//数据渲染Object.keys(dataObj).forEach(key => {if(key === "image"){document.querySelector(".rounded").src = dataObj[key] //照片回显document.querySelector(".rounded").classList.add("show") //显示照片盒子document.querySelector(".place").classList.add("hide") //隐藏加号盒子}else if(key === "content"){//设置富文本编辑框内容editor.setHtml(dataObj[key])}else{//利用name选择器赋值document.querySelector(`[name=${key}]`).value = dataObj[key]}}) }})
})();
保存文章
目标5:编辑-保存文章
5.1 判断按钮文字,区分业务(因为共用一套表单)
5.2 调用编辑文章接口,保存信息到服务器
5.3 基于 Alert 反馈结果消息给用户
//区分发布按钮与修改按钮
//——————————————————————发布文章/收集并保存中的留空1代码————————————————————————————//判断是否为发布按钮if(e.target.innerHTML != "发布") return
//————————————————————————————————————————————————————————————————————————————————
document.querySelector(".send").addEventListener("click", async e => {//判断是否为修改按钮if(e.target.innerHTML !== "修改") return//获取表单对象const form = document.querySelector(".art-form")//使用serialize插件获取表单数据const data = serialize(form, {hash: true, empty: true})//提交数据try{const res = await axios({url: `/v1_0/mp/articles/${data.id}`,method: "PUT",data:{...data,cover:{type: document.querySelector(".rounded").src ? 1 : 0,images: [document.querySelector(".rounded").src]}}})//成功弹窗myAlert(true, "修改成功!")//返回内容管理页面setTimeout(() =>{location.href = "../content/index.html"}, 1500)}catch(error){//异常弹窗myAlert(false, error.response.data.message)}
})
退出登录
目标3:退出登录
3.1 绑定点击事件
3.2 清空本地缓存,跳转到登录页面
//utils/auth.js//绑定事件
document.querySelector(".quit").addEventListener("click", () => {//清空本地缓存localStorage.clear()//提示框myAlert(true, "退出成功!即将返回登陆页面!")//跳转登录页面setTimeout(() => {location.href ="../login/index.html"}, 1500)
})相关文章:
AJAX项目——数据管理平台
黑马程序员视频地址: 黑马程序员——数据管理平台 前言 功能: 1.登录和权限判断 2.查看文章内容列表(筛选,分页) 3.编辑文章(数据回显) 4.删除文章 5.发布文章(图片上传࿰…...
MarsCode AI插件在IntelliJ IDEA中使用
文章目录 前言一、MarsCode是什么?二、下载三、使用1、登录2、操作界面3、生成代码4、解释代码5、注释代码6、生成单测7、智能修复8、代码补全 总结 前言 随着 AI 技术浪潮席卷而来,各类 AI 工具呈爆发式涌现,深度融入我们的日常与职场&…...
如何将网站提交百度收录完整SEO教程
百度收录是中文网站获取流量的重要渠道。本文以我的网站,www.mnxz.fun(当然现在没啥流量) 为例,详细讲解从提交收录到自动化维护的全流程。 一、百度收录提交方法 1. 验证网站所有权 1、登录百度搜索资源平台 2、选择「用户中心…...
基于 SVPWM 的异步电机直接转矩控制系统的研究与仿真
标题:基于 SVPWM 的异步电机直接转矩控制系统的研究与仿真 内容:1.摘要 摘要:本文主要研究了基于 SVPWM 的异步电机直接转矩控制系统。首先,介绍了异步电机直接转矩控制的基本原理和 SVPWM 技术的特点。然后,详细阐述了系统的设计方法&#…...
C# OpenCV机器视觉:SoftNMS非极大值抑制
嘿,你知道吗?阿强最近可忙啦!他正在处理一个超级棘手的问题呢,就好像在一个混乱的战场里,到处都是乱糟糟的候选框,这些候选框就像一群调皮的小精灵,有的重叠在一起,让阿强头疼不已。…...
生信云服务器:让生物信息学分析更高效、更简单【附带西柚云优惠码】
随着生物信息学的快速发展,基因组测序、单细胞分析等复杂任务逐渐成为研究者们的日常工作。然而,个人电脑在处理这些任务时往往面临性能瓶颈,如内存不足、运算速度慢等问题,导致分析任务频繁失败或崩溃。为了解决这一难题…...
【清晰教程】通过Docker为本地DeepSeek-r1部署WebUI界面
【清晰教程】本地部署DeepSeek-r1模型-CSDN博客 目录 安装Docker 配置&检查 Open WebUI 部署Open WebUI 安装Docker 完成本地DeepSeek-r1的部署后【清晰教程】本地部署DeepSeek-r1模型-CSDN博客,通过Docker为本地DeepSeek-r1部署WebUI界面。 访问Docker官…...
AI知识库和全文检索的区别
1、AI知识库的作用 AI知识库是基于人工智能技术构建的智能系统,能够理解、推理和生成信息。它的核心作用包括: 1.1 语义理解 自然语言处理(NLP):AI知识库能够理解用户查询的语义,而不仅仅是关键词匹配。 …...
Flink-序列化
一、概述 几乎每个Flink作业都必须在其运算符之间交换数据,由于这些记录不仅可以发送到同一JVM中的另一个实例,还可以发送到单独的进程,因此需要先将记录序列化为字节。类似地,Flink的堆外状态后端基于本地嵌入式RocksDB实例&…...
快速部署 DeepSeek R1 模型
1. DeepSeek R1 模型的介绍 DeepSeek R1 模型是专为自然语言处理(NLP)和其他复杂任务设计的先进大规模深度学习模型 ,其高效的架构设计是一大亮点,能够更高效地提取特征,减少冗余计算。这意味着在处理海量数据时&…...
Java全栈项目实战:在线课程评价系统开发
一、项目概述 在线课程评价系统是一款基于Spring Boot Vue3的全栈应用,面向高校师生提供课程评价、教学反馈、数据可视化分析等功能。系统包含Web管理端和用户门户,日均承载10万课程数据,支持高并发访问和实时数据更新。 项目核心价值&…...
数据库系统概念第六版记录 四
1.sql组成 SQL 是最有影响力的商用市场化的关系查询语言。SQL 语言包括几个部分: 数据定义语言(DDL) ,它提供了定义关系模式、删除关系以及修改关系模式的命令。 数据操纵语言(DML) ,它包括查询语言,以及往数据库中插入元组、从数据库中删…...
无人机飞行试验大纲
无人机飞行试验大纲 编制日期:2025年02月11日 一、试验目的与背景 本次无人机飞行试验旨在验证无人机的飞行性能、控制系统稳定性、机体结构强度以及各项任务执行能力。随着无人机技术在各个领域的广泛应用,对其性能进行全面、系统的测试显得…...
DeepSeek在FPGA/IC开发中的创新应用与未来潜力
随着人工智能技术的飞速发展,以DeepSeek为代表的大语言模型(LLM)正在逐步渗透到传统硬件开发领域。在FPGA(现场可编程门阵列)和IC(集成电路)开发这一技术密集型行业中,DeepSeek凭借其…...
DeepSeek-V3 的核心技术创新
DeepSeek-V3 的核心技术创新 flyfish DeepSeek-V3 的核心技术创新主要体现在其架构设计和训练目标上,通过 多头潜在注意力(MLA)、DeepSeekMoE 架构、无辅助损失的负载均衡策略 和 多 Token 预测训练目标(MTP) 1. 多…...
函数指针(Function Pointer)与 typedef int (*FuncPtr)(int, int);typedef与using(更推荐)
C 函数指针(Function Pointer)详解 函数指针是指向函数的指针,它可以存储函数地址,并通过该指针调用函数。函数指针在回调函数、策略模式、动态函数调用等场景中非常有用。 1. 什么是函数指针? 函数指针是一个指向函…...
【AI时代】以聊天框的模式与本地部署DeepSeek交互 (Docker方式-Open WebUI)
一、本地部署DeepSeek 参考地址:(含资源下载) https://blog.csdn.net/Bjxhub/article/details/145536134二、安装Docker https://www.docker.com/ 三、拉取Open WebUI 镜像 docker pull ghcr.io/open-webui/open-webui:main 四、启动并验证 启动: docker run …...
【Elasticsearch】监控与管理:集群监控指标
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
鸿蒙接入支付宝SDK后模拟器无法运行,报错error: install parse native so failed.
鸿蒙项目接入支付宝后,运行提示error: install parse native so failed. 该问题可能由于设备支持的 Abi 类型与 C 工程中的不匹配导致. 官网error: install parse native so failed.错误解决办法 根据官网提示在模块build-profile.json5中添加“x86_64”依然报错 问…...
react redux用法学习
参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 第一天 安装相关依赖: 使用redux的中间件: npm i react-redu…...
Maven 在 Eclipse 中的使用指南
Maven 在 Eclipse 中的使用指南 引言 Maven 是一个强大的项目管理和构建自动化工具,它可以帮助开发者更高效地管理项目依赖、构建和测试。Eclipse 作为一款流行的集成开发环境(IDE),与 Maven 的结合使用大大提高了 Java 项目的开发效率。本文将详细介绍如何在 Eclipse 中…...
【Matlab优化算法-第13期】基于多目标优化算法的水库流量调度
一、前言 水库流量优化是水资源管理中的一个重要环节,通过合理调度水库流量,可以有效平衡防洪、发电和水资源利用等多方面的需求。本文将介绍一个水库流量优化模型,包括其约束条件、目标函数以及应用场景。 二、模型概述 水库流量优化模型…...
Redis 集群(Cluster)和基础的操作 部署实操篇
三主三从 集群概念 Redis 的哨兵模式,提高了系统的可用性,但是正在用来存储数据的还是 master 和 slave 节点,所有的数据都需要存储在单个 master 和 salve 节点中。 如果数据量很大,接近超出了 master / slave 所在机器的物理内…...
[2025年最新]2024.3版本idea无法安装插件问题解决
背景 随着大模型的持续发展,特别年前年后deepseek的优异表现,编程过程中,需要解决ai来辅助编程,因此需要安装一些大模型插件 问题描述 在线安装插件的时候会遇到以下问题: 1.数据一直在加载,加载的很满 2.点…...
elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)
最近在学习使用elasticsearch,但是在安装插件ik的时候遇到许多问题。 所以在这里开始对elasticsearch做一个深度的研究。 首先提供如下链接: https://github.com/infinilabs/analysis-ik/releases 我们下载elasticsearch-7-17-2的Linux x86_64版本 …...
golang 开启HTTP代理认证
内部网路不能直接访问外网接口,可以通过代理发送HTTP请求。 HTTP代理服务需要进行认证。 package cmdimport ("fmt""io/ioutil""log""net/http""net/url""strings" )// 推送CBC07功能 func main() {l…...
【Unity3D】UGUI的anchoredPosition锚点坐标
本文直接以实战去理解锚点坐标,围绕着将一个UI移动到另一个UI位置的需求进行说明。 (anchoredPosition)UI锚点坐标,它是UI物体的中心点坐标,以UI物体锚点为中心的坐标系得来,UI锚点坐标受锚点(Anchors Min…...
C++多态性之包含多态(一)—学习记录
一、C的包含多态 面向对象程序设计的四大特点为抽象、封装、继承和多态,其中,多态性可以提高代码的可拓展性和可维护性。 多态是指同样的消息被不同类型的对象接收时导致不同的行为。所谓消息是指对类的成员函数的调用,不同的行为是指不同的实…...
KERL文献阅读分享:知识图谱与预训练语言模型赋能会话推荐系统
标题期刊年份Knowledge Graphs and Pre-trained Language Models enhanced Representation Learning for Conversational Recommender SystemsJournal of LaTeX Class Files2021 📈研究背景 在数字时代,个性化推荐系统已经成为了我们生活的一部分。从电…...
C#、.Net 中级高级架构管理面试题杂烩
1、简述值类型和引用类型的区别 存储位置:值类型变量直接存储数据的值,通常存储在栈上;引用类型变量存储的是对象在堆上的引用地址。 内存管理:值类型的内存由系统自动管理,当超出作用域时自动释放;引用类…...
