当前位置: 首页 > news >正文

数据管理平台

数据管理平台项目

文章目录

  • 数据管理平台项目
      • 业务1-登录验证
          • 代码步骤:
      • token 技术
          • token的使用
          • 代码步骤
      • axios 请求拦截器
          • 语法
          • 代码示例
      • axios响应拦截器
      • 优化axios响应结果
      • 发布文章-富文本编辑器
      • 发布文章-频道列表
      • 发布文章-封面设置
      • 发布文章-收集并保存
      • 内容管理-文章列表展示
          • 代码示例
      • 内容管理-筛选功能
          • 代码示例
      • 内容管理-分页功能
      • 内容管理-删除功能
      • 内容管理-编辑文章
      • 内容管理-编辑-保存文章
      • 退出登录

业务1-登录验证


功能: 完成验证码登录,后端设置验证码默认为:246810

代码步骤:
  1. 在utils/request.js配置 axios 请求基地址,提取公共前缀地址,配置后axios请求时都会baseURL + url。
  2. 收集手机号码验证数据
  3. 基于axios调用验证码登录接口
  4. 使用Bootstrap的Alert警告框反馈结果给用户.

##### 业务代码
  1. 在utils/request.js配置 axios 请求基地址,提取公共前缀地址,配置后axios请求时都会baseURL + url。
// axios 公共配置
// 基地址
axios.defaults.baseURL = 'http://geek.itheima.net'
  1. 收集手机号码验证数据
document.querySelector('.btn').addEventListener('click', () => {const form = document.querySelector('.login-form')const data = serialize(form ,{hash: true, empty: true})console.log(data)
  1. 基于axios调用验证码登录接口
    // 1.3 基于 axios 调用验证码登录接口axios({url: '/v1_0/authorizations',method: 'POST',data}).then(result => {console.log(result)//  1.4 使用 Bootstrap 的 Alert 警告框反馈结果给用户// 自己封装好了一个弹框插件,直接调用即可myAlert(true,'登录成功')}).catch(error => {console.dir(error.response.data.message)myAlert(false,error.response.data.message)})
})
  1. 自己封装好的弹框插件
// 弹窗插件
// 需要先准备 alert 样式相关的 DOM
/*** BS 的 Alert 警告框函数,2秒后自动消失* @param {*} isSuccess 成功 true,失败 false* @param {*} msg 提示消息*/
function myAlert(isSuccess, msg) {const myAlert = document.querySelector('.alert')myAlert.classList.add(isSuccess ? 'alert-success' : 'alert-danger')myAlert.innerHTML = msgmyAlert.classList.add('show')setTimeout(() => {myAlert.classList.remove(isSuccess ? 'alert-success' : 'alert-danger')myAlert.innerHTML = ''myAlert.classList.remove('show')}, 2000)
}

验证码登录流程
  1. 输入手机号,点击发送验证码。
  2. 携带手机号,调用服务器发送短信验证码接口
  3. 为此手机号生成验证码,记录生成的时间,并存在服务器
  4. 服务器携带手机号,验证码调用运营商接口
  5. 运营商通过基站给指定的手机号,发送验证码短信
  6. 运营商返回结果响应给服务端发送成功
  7. 服务端在将响应的结果返回给前端
  8. 根据手机短信填入验证码
  9. 在此携带手机号,验证码,调用验证码登录接口
  10. 服务器接收手机号和验证码,与之前用户输入的的记录对比,并且判断是否在有效期内。从而得出是否能够登录成功。

token 技术


token(访问权限的令牌),本质上是一串字符串

创建: 在正确的登录后,由后端签发并返回。

作用:判断是否有登录状态,控制访问权限。


token的使用

在登录状态时,是否能够访问内容页面

目标1:访问权限控制

代码步骤
  1. 判断无 token 令牌字符串,则强制跳转到登录页·
const token = localStorage.getItem('token')
if(!token) {location.href = '../login/index.html'
}

  1. 登录成功后,保存 token 令牌字符串到本地,并跳转到内容列表页面
localStorage.setItem('token',result.data.data.token)

然后通过令牌跳转页面

// 延迟时间跳转,停留提示后
setTimeout(() => {
// 登录成功能够通过令牌权限后,进行跳转到内容页location.href = '../content/index.html'},1500)

axios 请求拦截器


axios请求拦截器:在发起请求之前,触发的配置函数,对请求参数进行额外的配置。

语法

问题:很多接口都需要携带 token 令牌字符串。

解决:在请求拦截器统一设置公共样式headers选项。

axios({//因为我们给axios配置了基地址url: '目标资源路径',headers: {Authorization:`Bearer${localStorage.getItem('token')}`}
})

代码示例
// 添加请求拦截器
axios.interceptors.request.use(function (config) {// 在发送请求之前做些什么// 统一携带  token  令牌字符串在请求头上const token = localStorage.getItem('token')// 本地有token的话,则在配置对象中配置token令牌权限token && (config.headers.Authorization = `Bearer ${token}`)return config;}, function (error) {// 对请求错误做些什么return Promise.reject(error);}); 

axios响应拦截器


axios 响应拦截器:响应回到then / catch之前, 触发的拦截函数,对响应结果统一处理


例如身份验证失败,统一做出判断并处理(身份验证失败,我们就直接就将关闭权限)


// 添加响应拦截器
axios.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么return response;
}, function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么,例如401 身份验证失败情况做出处理console.dir(error)if (error?.response?.status === 401) {alert('身份验证失败,请重新登录')localStorage.clear()location.href = '../login/index.html'}return Promise.reject(error);
});

对响应的结果做出处理


优化axios响应结果


axios直接接受服务器返回的响应结果

    // 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么.例如:直接返回服务器的响应结果对象const result = response.datareturn result;

这样result === response.data 我们再写的时候可以省略这部分。


发布文章-富文本编辑器


富文本:带样式,多格式的文本,在前端一般使用标签配合内联样式实现。

  1. 准备HTML标签结构
                <!-- 富文本编辑器位置 --><div id="editor—wrapper"><div id="toolbar-container"><!-- 工具栏 --></div><div id="editor-container"><!-- 编辑器 --></div></div><!-- 记录富文本内容-用于表单收集 --><textarea name="content" class="publish-content" hidden></textarea>
  1. 引入对应的js和css的插件
  2. 在准备相应的样式
  3. 根据文档引入核心的js代码

文档:https://www.wangeditor.com/


发布文章-频道列表


步骤

  1. 获取频道列表数据
  2. 展示到下拉菜单中

代码示例

// 1.1 获取频道列表数据
async function setChannleList() {const res = await axios({url: '/v1_0/channels'})console.log(res)// 1.2 展示到下拉菜单中const htmlStr = `<option value="" selected="">请选择文章频道</option>` + res.data.channels.map(item => `<option value="${item.id}">${item.name}</option>`).join('')console.log(htmlStr)document.querySelector('.form-select').innerHTML = htmlStr
}
setChannleList()

事先考虑是否需要复用,需要则使用函数配和async和await来修饰。


发布文章-封面设置


步骤:

  1. 准备标签结构样式
  2. 选择文件并保存在FormData
  3. 单独好上传图片并得到图片url地址
  4. 回显并切换img标签展示(隐藏 + 号 上传标签)

注意:图片地址临时存储在img标签上,并未和文章关联保存。


// 2.1 准备标签结构和样式
// 2.2 选择文件并保存在 FormData
document.querySelector('.img-file').addEventListener('change',async e => {const file = e.target.files[0]const fd = new FormData()fd.append('image',file)// 2.3 单独上传图片并得到图片 URL 网址const res = await axios({url: '/v1_0/upload',method: 'POST',data: fd})console.log(res)// 2.4 回显并切换 img 标签展示(隐藏 + 号上传标签)const imgURL = res.data.urldocument.querySelector('.rounded').src = imgURL// 显示图片,添加showdocument.querySelector('.rounded').classList.add('show')// 隐藏基础的 + 号 上传标签 添加hide类document.querySelector('.place').classList.add('hide')
})// 优化:点击 img 可以重新切换封面
// 思路:img 点击  => 用 js 方式触发文件选择元素  click  事件方法
document.querySelector('.rounded ').addEventListener('click', () => {// 调用click()方法可以模拟用户触发该类绑定的点击事件。通过调用click()方法,就相当于以编程方式触发了与该类相关联的点击事件。document.querySelector('.img-file').click()
})

发布文章-收集并保存


步骤:

  1. 基于 form-serialize 插件收集表单数据对象
  2. 基于 axios 提交到服务器保存
  3. 调用 Alert 警告框反馈结果给用户
  4. 置表单并跳转到列表页

// 3.1 基于 form-serialize 插件收集表单数据对象
document.querySelector('.send').addEventListener('click', async e => {const form = document.querySelector('.art-form')const data = serialize(form, { hash: true, empty: true })//发布文章的时候才不需要  id  属性,所以可以删除掉(id 为了后续做编辑使用)delete data.idconsole.log(data)// 自己收集封面图片地址,并保存到  data  对象中data.cover = {type: 1,images: [document.querySelector('.rounded').src]}// 3.2 基于 axios 提交到服务器保存try {const result = await axios({url: '/v1_0/mp/articles',method: 'POST',data})// 3.3 调用 Alert 警告框反馈结果给用户myAlert(true, '发布成功')// 3.4 重置表单并跳转到列表页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) {myAlert(false, error.response.data.message)}
})

内容管理-文章列表展示


实现步骤:

* 1.1 准备查询参数对象

* 1.2 获取文章列表数据

* 1.3 展示到指定的标签结构中

注意:查询参数不能封装到函数里面,因为他不是永远固定的,然后再将获取和渲染封装到函数里面,后面很多操作都需要使用到获取和渲染,方便我们操作,下次直接调用函数即可。

代码示例
// 1.1 准备查询参数对象
const queryObj = {status: '',   //文章的状态    (1-待审核   2-通过审核   )  空字符串全部channel_id: '',  //文章频道, id  空字符串全部page: 1,   //当前页码per_page: 2     //当前页面的条数
}
// 1.2 获取文章列表数据
async function setArtileList() {const res = await axios({url: '/v1_0/mp/articles',params: queryObj})console.log(res)// 1.3 展示到指定的标签结构中const htmlStr = res.data.results.map(item => `<tr><td><img src="${item.cover.type === 0 ? `https://img2.baidu.com/it/u=2640406343,1419332367&amp;fm=253&amp;fmt=auto&amp;app=138&amp;f=JPEG?w=708&amp;h=500"` : item.cover.images[0]} alt=""></td><td>${item.title}</td><td>${item.status === 1 ? `<span class="badge text-bg-success">待审核</span>` : `<span class="badge text-bg-primary">审核通过</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><i class="bi bi-pencil-square edit"></i><i class="bi bi-trash3 del"></i></td></tr>`).join('')document.querySelector('.art-list').innerHTML = htmlStr
}
setArtileList()

内容管理-筛选功能


  1. * 2.1 设置频道列表数据

    * 2.2 监听筛选条件改变,保存查询信息到查询参数对象

    * 2.3 点击筛选时,传递查询参数对象到服务器

    * 2.4 获取匹配数据,覆盖到页面展示

代码示例
// 2.1 设置频道列表数据
async function setChannleList() {const res = await axios({url: '/v1_0/channels'})console.log(res)// 1.2 展示到下拉菜单中 const htmlStr = `<option value="" selected="">请选择文章频道</option>` + res.data.channels.map(item => `<option value="${item.id}">${item.name}</option>`).join('')console.log(htmlStr)document.querySelector('.form-select').innerHTML = htmlStr
}
setChannleList()// 2.2 监听筛选条件改变,保存查询信息到查询参数对象
// 筛选状态标记数字 -> change 事件   -> 绑定到查询参数对象上
document.querySelectorAll('.form-check-input').forEach(radio => {radio.addEventListener('change', e => {queryObj.status = e.target.value})
})
// 筛选频道的 id  -> change 事件 -> 绑定到查询参数对象上
document.querySelector('.form-select').addEventListener('change', e => {queryObj.channel_id = e.target.value
})// 2.3 点击筛选时,传递查询参数对象到服务器
document.querySelector('.sel-btn').addEventListener('click', () => {// 2.4 获取匹配数据,覆盖到页面展示setArtileList()
})

内容管理-分页功能


* 3.1 保存并设置文章总条数

* 3.2 点击下一页,做临界值判断,并切换页码参数并请求最新数据

* 3.3 点击上一页,做临界值判断,并切换页码参数并请求最新数据

* 3.1 保存并设置文章总条数

let totalCount = 0   //保存文章总条数  
// 3.1 保存并设置文章总条数const totalStr = totalCount = res.data.total_count// 将获取到的返回数据个数插入到页面中document.querySelector('.total-count').innerHTML = `${totalStr}`
// 3.1 保存并设置文章总条数//  3.2 点击下一页,做临界值判断,并切换页码参数并请求最新数据
document.querySelector('.next').addEventListener('click', () => {// 当前页码小于最大页码数才能翻页if (queryObj.page < Math.ceil(totalCount / queryObj.per_page)) {// 当前页增加queryObj.page++document.querySelector('.page-now').innerHTML = `${queryObj.page}`// 调用函数,渲染最新数据setArtileList()}
})
//  3.3 点击上一页,做临界值判断,并切换页码参数并请求最新数据
document.querySelector('.page-link').addEventListener('click', () => {// 判断当前页码大于1的时候才能够执行if (queryObj.page > 1) {queryObj.page--document.querySelector('.page-now').innerHTML = `${queryObj.page}`// 调用函数,渲染最新数据setArtileList()}
})

内容管理-删除功能


  • 4.1 关联文章 id 到删除图标
  • 4.2 点击删除时,获取文章 id
  • 4.3 调用删除接口,传递文章 id 到服务器
  • 4.4 重新获取文章列表,并覆盖展示
  • 4.5 删除最后一页的最后一条,需要自动向前翻页
// 4.1 关联文章 id 到删除图标<td data-id="${item.id}"><i class="bi bi-pencil-square edit"></i><i class="bi bi-trash3 del"></i></td>
//  4.2 点击删除时,获取文章 id
document.querySelector('.art-list').addEventListener('click',async e => {//判断点击的是否为删除元素if (e.target.classList.contains('del')) {const delId = e.target.parentNode.dataset.idconsole.log(delId)// 4.3 调用删除接口,传递文章 id 到服务器const res = await axios({url: `/v1_0/mp/articles/${delId}`,method: 'DELETE',})// 4.5 删除最后一页的最后一条,需要自动向前翻页const children = document.querySelector('.art-list').childrenif (children.length === 1 && queryObj.page !== 1) {queryObj.page--document.querySelector('.page-now').innerHTML = `${queryObj.page}`}// 4.4 重新获取文章列表,并覆盖展示setArtileList()}})

内容管理-编辑文章


\* 4.1 页面跳转传参(URL 查询参数方式)

* 4.2 发布文章页面接收参数判断(共用同一套表单)

* 4.3 修改标题和按钮文字

* 4.4 获取文章详情数据并回显表单


//跨页面传参  传递id值// 点击编辑时,获取文章 id,跳转到发布文章页面传递文章 id 过去(使用事件委托)
document.querySelector('.art-list').addEventListener('click', e => {// 判断用户点击的是哪一个标签对象if (e.target.classList.contains('edit')) {// 拿到事件对象父级中的自定义属性 id值const artId = e.target.parentNode.dataset.idlocation.href = `../publish/index.html?id=${artId}`}
})
// 4.1 页面跳转传参(URL 查询参数方式)     立即执行函数,自己调用自己,防止变量污染
;(function () {// console.log(location.search)//查看查询参数字符串,就是?号后面的// 4.2 发布文章页面接收参数判断(共用同一套表单)const paramsStr = location.searchconst params = new URLSearchParams(paramsStr)       //分隔网址后面的查询参数params.forEach(async (value,key) => {// console.log(value,key)// 4.3 修改标题和按钮文字if (key === 'id') {// 当前有要编辑的文章 id 被传入过来document.querySelector('.title span').innerHTML = '修改文章'document.querySelector('.send').innerHTML = '修改'// 4.4 获取文章详情数据并回显表单const res = await axios({url: `/v1_0/mp/articles/${value}`,})console.log(res)// ***组织我需要的数据对象,我后续遍历回显到页面上做铺垫const dataObj = {channel_id: res.data.channel_id,title: res.data.title,rounded: res.data.cover.images[0],//封面图content: res.data.content,id: res.data.id}// ***遍历数据对象属性,映射到页面元素上,快速赋值Object.keys(dataObj).forEach(key => {console.log(key)if (key === 'rounded') {// 封面设置if (dataObj[key]) {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.1 判断按钮文字,区分业务(因为共用一套表单)

* 5.2 调用编辑文章接口,保存信息到服务器

* 5.3 基于 Alert 反馈结果消息给用户


document.querySelector('.send').addEventListener('click', async e => {// 5.1 判断按钮文字,区分业务(因为共用一套表单)if (e.target.innerHTML !== '修改') return// 修改文章逻辑// 5.2 调用编辑文章接口,保存信息到服务器try {const form = document.querySelector('.art-form')const data = serialize(form, { hash: true, empty: true })console.log(data)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]}}})console.log(res)myAlert(true,'修改文章成功')} catch (error) {myAlert(false,'error.response.data.message')}
})

退出登录


\* 3.1 绑定点击事件

* 3.2 清空本地缓存,跳转到登录页面

// 3.1 绑定点击事件
document.querySelector('.quit').addEventListener('click', e => {// 3.2 清空本地缓存,跳转到登录页面localStorage.clear()location.href = '../login/index.html'
})

相关文章:

数据管理平台

数据管理平台项目 文章目录 数据管理平台项目业务1-登录验证代码步骤&#xff1a; token 技术token的使用代码步骤 axios 请求拦截器语法代码示例 axios响应拦截器优化axios响应结果发布文章-富文本编辑器发布文章-频道列表发布文章-封面设置发布文章-收集并保存内容管理-文章列…...

手搓大语言模型 使用jieba分词制作词表,词表大小几十万 加强依赖性

jieba分词词表生成与训练 import numpy as np import paddle import pandas as pd from multiprocessing import Process, Manager, freeze_support from just_mask_em import JustMaskEm, HeadLoss from tqdm import tqdm from glob import glob import jieba import warning…...

【校招VIP】java语言类和对象之map、set集合

考点介绍&#xff1a; map、set集合相关内容是校招面试的高频考点之一。 map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索效率与其具体的实例化子类有关系。 『java语言类和对象之map、set集合』相关题目及解析内容可点击文章末尾链接查看&#xff01; …...

windows服务器下java程序健康检测及假死崩溃后自动重启应用、开机自动启动

前两天由于项目需要&#xff0c;一个windows上的批处理任务&#xff08;kitchen.bat&#xff09;&#xff0c;需要接到mq的消息通知后执行&#xff0c;为了快速实现这里我们通过springboot写了一个jar程序&#xff0c;用于接收mq的消息&#xff0c;并调用bat文件。 本程序需要实…...

七夕特辑(一)浪漫表白方式 用神经网络生成一首情诗

目录 一、准备工作二、用神经网络生成一首诗&#xff0c;代码说明 牛郎织女相会&#xff0c;七夕祝福要送来。祝福天下有情人&#xff0c;终成眷属永相伴。 七夕是中国传统的情人节&#xff0c;也是恋人们表达爱意的好时机。在这个特别的日子里&#xff0c;送上温馨的祝福&…...

springboot的 spring.redis.lettuce的max-active、max-idle、min-idle的搭配

在Spring Boot中&#xff0c;使用Lettuce作为Redis客户端是一种常见的选择。Lettuce是一个高性能、可扩展的异步Redis客户端。下面是关于application.yml配置文件中spring.redis.lettuce的一些配置&#xff1a; spring:redis:host: localhostport: 6379database: 0lettuce:poo…...

盒子模型样式

&#x1f353;盒子属性 属性名称中文注释备注border设置盒子的边框边框宽度 边框类型 边框颜色border-left设置左边框边框宽度 边框类型 边框颜色border-right设置右边框边框宽度 边框类型 边框颜色border-top设置上边框边框宽度 边框类型 边框颜色border-bottom设置下边框边框…...

动态规划入门之线性动态规划

P1115 最大子段和 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目要求求连续得一段子串使其累加和最大。 我们做动态规划首先考虑小情况&#xff0c;然后推而广之。 假设三个数1&#xff0c;-2&#xff0c;5. 我们先选1然后我们在-2以及-2加1里边选&#xff0c;我们选…...

基于HTML+CSS+Echarts大屏数据可视化集合共99套

基于HTMLCSSEcharts大屏数据可视化集合共99套 一、介绍二、展示1.大数据展示系统2.物流订单系统3.物流信息系统4.办税渠道监控平台5.车辆综合管控平台 三、其他系统实现四、获取源码 一、介绍 基于HTML/CSS/Echarts的会议展览、业务监控、风险预警、数据分析展示等多种展示需求…...

Leetcode 0814周总结

本周刷题&#xff1a; 88, 108, 121, 219, 228, 268, 283, 303, 349, 350, 414, 448 88 合并两个有序数组 nums1{1, 2, 3 ,0, 0, 0} nums2{2, 5, 6} 合成效果&#xff1a;nums1{1, 2, 2, 3, 5, 6} 思路&#xff1a;【双指针】对两个数组设置双指针&#xff0c;依次比较哪…...

华为网络篇 OSPF的Silent-Interface-33

难度1复杂度1 目录 一、实验拓扑 二、实验步骤 三、实验过程 总结 一、实验拓扑 二、实验步骤 1.搭建如图所示的网络拓扑&#xff1b; 2.初始化各设备&#xff0c;配置相应的IP地址&#xff0c;测试直连网络的连通性&#xff1b; 3.整个网络配置OSPF协议&#xff0c;查看…...

longtext,bigint是什么数据类型

longtext 是一种数据类型&#xff0c;用于在关系型数据库中存储长文本或大段的文本数据。它通常用于存储超过普通文本长度限制的内容&#xff0c;比如文章、博客内容、HTML 代码等。 在多数关系型数据库中&#xff0c;longtext 是一种用于存储可变长度字符数据的类型&#xff…...

Hive无法启动的解决方案

关掉虚拟机后&#xff0c;重新启动后&#xff0c;按照Hadoop和Hive的流程重新启动&#xff0c;发现无法启动成功&#xff0c;特别是元数据服务无法启动&#xff0c;出现以下错误: Exception in thread “main” java.lang.RuntimeException: java.net.ConnectException: Call F…...

华为云零代码新手教学-体验通过Astro Zero快速搭建微信小程序

您将会学到 您将学会如何基于Astro零代码能力&#xff0c;DIY开发&#xff0c;完成问卷、投票、信息收集、流程处理等工作&#xff0c;还能够在线筛选、分析数据。实现一站式快速开发个性化应用&#xff0c;体验轻松拖拽开发的乐趣。 您需要什么 环境准备 注册华为云账号、实…...

【前端】快速掌握HTML+CSS核心知识点

文章目录 1.HTML核心基础知识1.1.编写第一个HTML网页1.2.超链接a标签和路径1.3.图像img标签的用法1.4.表格table标签用法1.5.列表ul、ol、dl标签用法1.6.表单form标签用法1.7.区块标签和行内标签用法 2.CSS核心基础知识2.1.CSS标签选择器viewport布局2.2.CSS样式的几种写法2.3.…...

二叉树算法的框架套路总结

二叉树算法的框架套路总结 总结 本文主要来源于Leetcode用户&#xff1a;https://leetcode.cn/u/labuladong/&#xff0c;感谢写了这么好的文章作者&#xff1a;labuladong 链接&#xff1a;https://leetcode.cn/problems/same-tree/solutions/6558/xie-shu-suan-fa-de-tao-l…...

【ARM 嵌入式 编译 Makefile 系列 2 - Makefile 如何打印信息】

文章目录 Makefile 打印信息方法介绍Makefile 打印信息方法介绍 在Makefile中,我们可以使用echo命令来打印信息。这种方法适用于大多数的 UNIX shell,包括bash、sh、ksh、zsh等。 在 Makefile 中的规则部分,你可以添加 echo 命令来打印一些信息。例如: all: echo "…...

re学习(34)攻防世界-csaw2013reversing2(修改汇编顺序)

参考文章&#xff1a; re学习笔记&#xff08;27&#xff09;攻防世界-re-csaw2013reversing2_Forgo7ten的博客-CSDN博客攻防世界逆向入门题之csaw2013reversing2_沐一 林的博客-CSDN博客 三种做法 1、ida静态分析修改指令 main函数反编译的代码 由于运行之后的是乱码&…...

centos 7.9 部署django项目

1、部署框架 主要组件&#xff1a;nginx、uwsgi、django项目 访问页面流程&#xff1a;nginx---》uwsgi---》django---》uwsgi---》nginx 2、部署过程 操作系统&#xff1a;centos 7.9 配置信息&#xff1a;4核4G 50G 内网 eip &#xff1a;10.241.103.216 部署过程&…...

12 正则表达式 | HTTP协议相关介绍

文章目录 正则表达式re模块最基础操作&#xff08;匹配开头&#xff09;匹配单个字符匹配多个字符匹配开头结尾匹配分组对于group的理解r的作用re 模块高级用法compilesearchfindall易错点 sub直接替换函数替换 split 根据匹配进行切割字符串&#xff0c;并返回一个列表 python…...

【C语言】数组概述

&#x1f6a9;纸上得来终觉浅&#xff0c; 绝知此事要躬行。 &#x1f31f;主页&#xff1a;June-Frost &#x1f680;专栏&#xff1a;C语言 &#x1f525;该篇将带你了解 一维数组&#xff0c;二维数组等相关知识。 目录&#xff1a; &#x1f4d8;前言&#xff1a;&#x1f…...

8. 实现业务功能--用户注册

目录 1. 顺序图 2. 参数要求 3. 接口规范 4. 创建扩展 Mapper.xml 5. 修改 DAO 6. 创建 Service 接口 7. 实现接口 8. 测试接口 9. 实现 Controller 9.1 密码加密处理 10. 实现前端界面 业务实现过程中主要的包和目录及主要功能&#xff1a; model 包&#xff1a;实体对象 d…...

深入浅出Pytorch函数——torch.nn.init.eye_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

版本控制工具Git集成IDEA的学习笔记(第一篇Gitee)

目录 一、Gitee的使用 1、注册网站会员 2、用户中心 3、创建远程仓库 4、配置SSH免密登录 二、集成IDEA&#xff0c;Git项目搭建 1、本地仓库搭建 1&#xff09;创建一个新项目 2&#xff09;打开终端&#xff0c;在当前目录新建一个Git代码库 3&#xff09;忽略文件 …...

【链表】 61. 旋转链表

61. 旋转链表 解题思路 首先计算出链表长度将链表长度进行取余遍历链表 对链表进行分割 得到两个子链表重新连接两个链表比如1 2 3 4 5 k 2 进行分割得到 1 2 3 和 4 5两个子链表 /*** Definition for singly-linked list.* public class ListNode {* int val;* Lis…...

深入浅出Pytorch函数——torch.nn.init.kaiming_uniform_

分类目录&#xff1a;《深入浅出Pytorch函数》总目录 相关文章&#xff1a; 深入浅出Pytorch函数——torch.nn.init.calculate_gain 深入浅出Pytorch函数——torch.nn.init.uniform_ 深入浅出Pytorch函数——torch.nn.init.normal_ 深入浅出Pytorch函数——torch.nn.init.c…...

查询Oracle和MySQL数据库中当前所有连接信息

查询Oracle当前所有连接信息&#xff1a; SELECTs.sid AS 会话ID,s.serial# AS 序列号,s.username AS 用户名,s.osuser AS 操作系统用户,s.machine AS 客户端机器,s.program AS 客户端程序,s.status AS 会话状态,s.sql_id AS 正在执行的SQL_ID,t.sql_text AS 正在执行的SQL文本…...

Android glide框架及框架涉及到的设计模式

目录 原文链接Android glide框架 简单使用介绍Glide 框架整体结构设计Glide 框架的优点基本使用&#xff1a;Glide占位符 Android glide框架涉及到的设计模式 原文链接 Android glide框架 简单使用介绍 Glide&#xff1a;快速高效的Android图片加载库&#xff0c;可以自动加载…...

使用yolov5进行安全帽检测填坑指南

参考项目 c​​​​​​​​​​​​​​GitHub - PeterH0323/Smart_Construction: Base on YOLOv5 Head Person Helmet Detection on Construction Sites&#xff0c;基于目标检测工地安全帽和禁入危险区域识别系统&#xff0c;&#x1f680;&#x1f606;附 YOLOv5 训练自己的…...

【BASH】回顾与知识点梳理(三十二)

【BASH】回顾与知识点梳理 三十二 三十二. SELinux 初探32.1 什么是 SELinux当初设计的目标&#xff1a;避免资源的误用传统的文件权限与账号关系&#xff1a;自主式访问控制, DAC以政策规则订定特定进程读取特定文件&#xff1a;委任式访问控制, MAC 32.2 SELinux 的运作模式安…...

vscode远程调试PHP代码

目录 一、准备工作 二、ssh连接和xdebug配置 1.ssh连接 2.xdebug配置 三、xdebug调试&#xff0c;访问 一、准备工作 1.安装vscode里面的两个扩展 2.安装对应PHP版本的xdebug 去xdebug官方&#xff0c;复制自己的phpinfo源码到方框里&#xff0c;再点击Analyse Xdebug: …...

flink1.17 实现 udf scalarFunctoin get_json_object 支持 非标准化json

特色 相比官方的json_value,该函数支持非标准化json,比如v是个object,但是非标准json会外套一层引号,内部有反引号. eg: {"kkkk2": "{\"kkkk1\":\"vvvvvvv\"}" } 支持value为 100L 这种java格式的bigint. {"k":999L…...

基于VUE3+Layui从头搭建通用后台管理系统(前端篇)九:自定义组件封装下

一、本章内容 续上一张,本章实现一些自定义组件的封装,包括文件上传组件封装、级联选择组件封装、富文本组件封装等。 1. 详细课程地址: 待发布 2. 源码下载地址: 待发布 二、界面预览 三、开发视频 基于VUE3+Layui从头搭建通用后台管...

设计模式详解-装饰器模式

类型&#xff1a;结构型模式 实现原理&#xff1a;装饰器模式通过将对象包装在装饰器类中&#xff0c;并在保持类方法签名完整性的前提下&#xff0c;提供额外功能 作用&#xff1a;动态地给一个对象添加一些额外的职责。增加功能方面&#xff0c;装饰器模式比生成子类更灵活…...

Android5:活动生命周期

创建项目Stopwatch activity_main.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayoutxmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_w…...

第2章 数据结构和算法概述

2.3线性结构和非线性结构 数据结构包括: 线性结构和非线性结构 2.3.1线性结构 线性结构作为最常用的数据结构&#xff0c;其特点是数据元素之间存在一对一的线性关系线性结构有两种不同的存储结构&#xff0c;即顺序存储结构(数组)和链式存储结构(链表)。顺序存储的线性表称…...

WPF国际化的实现方法(WpfExtensions.Xaml)

https://blog.csdn.net/eyupaopao/article/details/120090431 resx资源文件实现 resx资源文件&#xff0c;实现的过程比第一种复杂&#xff0c;但resx文件本身编辑比较简单&#xff0c;维护起来比较方便。需要用到的框架&#xff1a;WpfExtensions.Xaml 为每种语言添加.resx资…...

【Linux】—— 进程程序替换

目录 序言 &#xff08;一&#xff09;替换原理 1、进程角度——见见猪跑 1️⃣ 认识 execl 函数 2、程序角度——看图理解 &#xff08;二&#xff09;替换函数 1、命名理解 2、函数理解 1️⃣execlp 2️⃣execv 3️⃣execvp 4️⃣execle 5️⃣execve 6️⃣execve…...

idea创建javaweb项目,jboss下没有web application

看看下图这个地方有没有web application...

广东灯具3D扫描抄数建模服务3D测绘出图纸三维逆向设计-CASAIM

灯具三维逆向建模是一种将实际物体转换为数字模型的过程。通过逆向工程技术&#xff0c;可以将现有的灯具进行3D扫描&#xff0c;然后利用专业的逆向设计软件将其转换为准确的三维模型。 以下是CASAIM实施灯具三维逆向建模的一般步骤图&#xff1a; 1. 扫描&#xff1a;三维扫…...

Nginx反向代理-负载均衡、webshell实践

目录 1.nginx反向代理-负载均衡 1&#xff09;搭建web项目 2&#xff09;修改 nginx.conf的配置 2.webshell 实践 1&#xff09;异或操作绕过 2&#xff09;取反绕过 3&#xff09;php语法绕过 1.nginx反向代理-负载均衡 1&#xff09;搭建web项目 首先通过SpringBoo…...

第六阶|见道明心的笔墨(上)从书法之美到生活之美——林曦老师的线上直播书法课

如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程 如果你有需要&#xff0c;可以找我的&#xff0c;我这边有老师的所有课程...

nbcio-boot从3.0升级到3.1的出现用户管理与数据字典bug

升级后出现 系统管理里的用户管理出现下面问题 2023-08-17 09:44:38.902 [http-nio-8080-exec-4] [1;31mERROR[0;39m [36mo.jeecg.common.exception.JeecgBootExceptionHandler:69[0;39m - java.lang.String cannot be cast to java.lang.Long java.lang.ClassCastException:…...

Curson 编辑器

Curson 汉化与vacode一样 Curson 自带chat功能 1、快捷键ctrlk(代码中编辑) 2、快捷键ctrll 右侧打开窗口...

Shell编程学习之函数的应用

Shell编程中的函数&#xff1a;伪代码表示&#xff1a; function 函数名(){函数体}注意事项&#xff1a; 1.函数无参数&#xff1b; 2.函数无返回值类型&#xff1b; 3.function可以不写&#xff1b; 4.函数不被调用&#xff0c;就不会执行&#xff1b; 5.函数名不能使用…...

Fork/Join框架

是什么 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架&#xff0c;是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 Fork: 把一个大任务切分为若干子任务并行的执行 Join: 合并这些子任务的执行结果&#xff0c;最后…...

LeetCode_字符串_中等_468.验证 IP 地址

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给定一个字符串 queryIP。如果是有效的 IPv4 地址&#xff0c;返回 “IPv4” &#xff1b;如果是有效的 IPv6 地址&#xff0c;返回 “IPv6” &#xff1b;如果不是上述类型的 IP 地址&#xff0c;返回 “Nei…...

ABAP Der Open SQL command is too big.

ABAP Der Open SQL command is too big. DBSQL_STMNT_TOO_LARGE CX_SY_OPEN_SQL_DB 应该是选择条件中 维护的条件值条数太多了...

QChart类用来 管理 图表的:数据序列(series)、图例(legend)和坐标轴(axis)

QChart类用来 管理 图表的&#xff1a;数据序列&#xff08;series&#xff09;、图例&#xff08;legend&#xff09;和坐标轴&#xff08;axis&#xff09; 1、数据序列类 继承关系 2、坐标轴类 的继承关系 3、图例类 什么是图例&#xff1f; 图例&#xff1a;是集中于地图…...

Servlet+JDBC实战开发书店项目讲解第10篇:在线客服功能实现

在线客服功能实现 实现思路 要实现在线客服功能&#xff0c;您可以考虑以下步骤&#xff1a; 创建一个用于存储客户消息和回复的数据库表。您可以使用JDBC连接到数据库&#xff0c;并使用SQL语句创建表格。 在您的Servlet中&#xff0c;创建一个用于处理客户消息和回复的POS…...

【深度学习】扫描全能王的AI驱动创新与智能高清滤镜技术解析

目录 引言1、扫描全能王2、智能高清滤镜黑科技2.1、图像视觉矫正2.2、去干扰技术 3、实际应用案例3.1、打印文稿褶皱检测3.2、试卷擦除手写3.3、老旧文件处理3.4、收银小票3.5、从不同角度扫描文档 4、用户体验结论与未来展望 引言 在数字化时代背景下&#xff0c;文档扫描功能…...

一文读懂行式存储和列式存储

今年下半年的小陈&#xff0c;主跟CDP项目。 项目在数据接入阶段&#xff0c;团队小伙伴每天都在死啃数据库。今天CRM、明天DMS&#xff0c;后天还有神策APP埋点和DMP埋点。 数据枯燥&#xff0c;也能发现一些有意思的玩意儿。 甲方的各系统分别在不同年份建设的。在盘点细节…...

LeetCode 35, 242, 994

目录 35. 搜索插入位置题目链接标签思路代码 242. 有效的字母异位词题目链接标签思路代码 994. 腐烂的橘子题目链接标签思路代码 35. 搜索插入位置 题目链接 35. 搜索插入位置 标签 数组 二分查找 思路 本题与 704. 二分查找 十分相似&#xff0c;只不过本题在找不到 tar…...

DNS服务器

DNS服务器 一、DNS简介&#xff1a; DNS&#xff08;Domain Name System&#xff09;是一种用于将域名解析为IP地址的系统。 在DNS中&#xff0c;正向解析将域名转换为IP地址&#xff0c;而反向解析将IP地址转换为域名。正向解析是DNS系统最常用的解析方式&#xff0c;它允许…...

面向对象进阶

面向对象进阶 文章目录 面向对象进阶static&#xff08;静态&#xff09;static内存图工具类练习 static的注意事项重新认识main方法 继承继承的特点练习 子类到底能继承父类中的哪些内容内存图构造方法成员变量成员方法小结 内存分析工具 继承中&#xff1a;成员变量的访问特点…...

基于Pinia的WebSocket管理与优化实践(实现心跳重连机制,异步发送)

WebSocket作为一种全双工通信协议&#xff0c;允许服务器和客户端之间建立持久的连接&#xff0c;提供了比传统HTTP请求更为高效的数据交换方式。本文将探讨如何使用Pinia状态管理库在Vue应用中优雅地管理和优化WebSocket连接&#xff0c;以实现稳定、高效的实时数据传输。 环境…...

2024年全球汽车零部件供应商百强榜出炉:宁德时代排第4!国轩高科新上榜

6月23日,《美国汽车新闻》重磅发布了2024年全球汽车零部件供应商百强榜。值得一提的是,今年上榜的中国企业又多了两家,分别是国轩高科和三花汽零,另外宁德时代的排名又上升了一位,目前仅次于博世、采埃孚和麦格纳国际这三家传统零部件巨头。中国企业一共上榜15家,其中前5…...

透视全新哈弗H6:价格“高开低走”,销量能否进阶尚待观察

全新哈弗H6的发布会主题为“底线与进阶”,关于这两个词品牌方有自己的解读,第三方也可以有自己的理解。新款车的价格坚守住的底线,只不过还是采用了“高开低走”的方案。新款1.5T7DCT系列,售价11.79、12.39、13.19万元新款2.0T9DCT系列,售价13.39、14.39万元对于一辆紧凑级…...

【微机原理及接口技术】可编程计数器/定时器8253

【微机原理及接口技术】可编程计数器/定时器8253 文章目录 【微机原理及接口技术】可编程计数器/定时器8253前言一、8253的内部结构和引脚二、8253的工作方式三、8253的编程总结 前言 本篇文章就8253芯片展开&#xff0c;详细介绍8253的内部结构和引脚&#xff0c;8253的工作方…...

ffmpeg3.1.1版本连接ftp服务器失败

发现这个问题是在ffmpeg4之后修复的&#xff1a; 原因在于libavformat文件下的ftp.c文件&#xff1a; 修改方法&#xff1a;加入在TCP控制连接时加入应答代码202&#xff1a; static int ftp_features(FTPContext *s) {static const char *feat_command "FEAT\r\…...

做场外个股期权怎么询价

做场外个股期权怎么询价&#xff1f;没有具体的哪家做市商是询价是最低的&#xff0c;个人投资者需要通过机构通道方询价进行对比&#xff0c;各券商的报价由询价机构方提供给到投资者&#xff0c;可以参考不同券商的报价进行比对&#xff0c;再决定是否进行投资。本文来自&…...

Google Benchmark库 简介

在C中&#xff0c;进行性能测试&#xff08;Benchmarking&#xff09;是一个常见的需求&#xff0c;用以测量代码块的执行时间&#xff0c;从而对代码进行优化。Google Benchmark库是一个广泛使用的C库&#xff0c;专门用于编写稳健的基准测试。以下是如何使用Google Benchmark…...