go 集成base64Captcha 支持多種驗證碼

base64Captcha 是一個基于 Go 語言開發的驗證碼生成庫,主要用于在 Web 應用中集成驗證碼功能,以增強系統的安全性。以下是其主要特點和簡介:

base64Captcha主要功能

  • 驗證碼類型豐富:支持生成多種類型的驗證碼,包括純數字、純字母、數字與字母組合、數學公式、漢字、音頻等,滿足不同場景的需求。
  • 多種存儲方式
    • 內存存儲:簡單易用,低延遲,無網絡開銷,但無法進行數據持久化,擴展性較差,適合單機部署。
    • Redis 存儲:性能高,支持分布式存儲,但會增加網絡開銷,同時具有一定的復雜度,適合多臺服務器部署的場景。
  • 自定義配置靈活
    • 驗證碼驅動:可以通過實現 Driver 接口來自定義驗證碼的生成邏輯,也可以使用庫自帶的多種驅動,如 DriverStringDriverMathDriverChineseDriverAudioDriverDigit 等。
    • 驗證碼樣式:支持自定義驗證碼的高度、寬度、噪點數量、干擾線數量、驗證碼長度、字符源、背景色、字體等樣式參數。
  • 返回格式便捷:以 base64 編碼方式返回驗證碼圖片,方便前端展示。

使用示例

以下是一個使用 base64Captcha 生成和驗證驗證碼的簡單示例:

后端代碼
// example of HTTP server that uses the captcha package.
package mainimport ("encoding/json""fmt""github.com/mojocn/base64Captcha""log""net/http""time"
)// configJsonBody json request body.
type configJsonBody struct {Id            stringCaptchaType   stringVerifyValue   stringDriverAudio   *base64Captcha.DriverAudioDriverString  *base64Captcha.DriverStringDriverChinese *base64Captcha.DriverChineseDriverMath    *base64Captcha.DriverMathDriverDigit   *base64Captcha.DriverDigit
}// var store = base64Captcha.DefaultMemStore
var store = base64Captcha.NewMemoryStore(1000, time.Minute*2)// base64Captcha create http handler
func generateCaptchaHandler(w http.ResponseWriter, r *http.Request) {//parse request parametersdecoder := json.NewDecoder(r.Body)var param configJsonBodyerr := decoder.Decode(&param)if err != nil {log.Println(err)}defer r.Body.Close()var driver base64Captcha.Driver//choose driverswitch param.CaptchaType {case "audio":driver = param.DriverAudiocase "string":driver = param.DriverString.ConvertFonts()case "math":driver = param.DriverMath.ConvertFonts()case "chinese":driver = param.DriverChinese.ConvertFonts()default:driver = param.DriverDigit}c := base64Captcha.NewCaptcha(driver, store)id, b64s, _, err := c.Generate()body := map[string]interface{}{"code": 1, "data": b64s, "captchaId": id, "msg": "success"}if err != nil {body = map[string]interface{}{"code": 0, "msg": err.Error()}}w.Header().Set("Content-Type", "application/json; charset=utf-8")json.NewEncoder(w).Encode(body)
}// base64Captcha verify http handler
func captchaVerifyHandle(w http.ResponseWriter, r *http.Request) {//parse request parametersdecoder := json.NewDecoder(r.Body)var param configJsonBodyerr := decoder.Decode(&param)if err != nil {log.Println(err)}defer r.Body.Close()//verify the captchabody := map[string]interface{}{"code": 0, "msg": "failed"}if store.Verify(param.Id, param.VerifyValue, true) {body = map[string]interface{}{"code": 1, "msg": "ok"}}//set json responsew.Header().Set("Content-Type", "application/json; charset=utf-8")json.NewEncoder(w).Encode(body)
}// start a net/http server
func main() {//serve Vuejs+ElementUI+Axios Web Applicationhttp.Handle("/", http.FileServer(http.Dir("./static")))//api for create captchahttp.HandleFunc("/api/getCaptcha", generateCaptchaHandler)//api for verify captchahttp.HandleFunc("/api/verifyCaptcha", captchaVerifyHandle)fmt.Println("Server is at :9599")if err := http.ListenAndServe(":9599", nil); err != nil {log.Fatal(err)}
}
前端頁面
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>Config Parameter Playground</title><meta name="Keywords" content="golang,godoc,captcha,base64,png,圖像驗證碼"/><meta name="Description" content="Base64 Captcha"/><link rel="stylesheet" href="https://cdn.bootcss.com/element-ui/2.0.11/theme-chalk/index.css"><style>.el-header, .el-footer {background-color: #B3C0D1;color: #333;text-align: center;line-height: 0px;}.el-header > p {margin-top: 12px !important;}.el-main {background-color: #E9EEF3;color: #333;text-align: center;/*line-height: 160px;*/}body {margin: 0px;text-align: center;}.login-container {-webkit-border-radius: 5px;border-radius: 5px;-moz-border-radius: 5px;background-clip: padding-box;margin: 15px auto auto auto;width: 480px;padding: 6px;background: #fff;border: 1px solid #eaeaea;box-shadow: 0 0 25px #cac6c6;}.title {margin: 0px auto 20px auto;text-align: center;color: #505458;}.captcha-img {cursor: pointer;position: relative;border: 1px solid chartreuse;box-shadow: 0 0 6px #cac6c6;}.el-form-item {margin-bottom: 0px;}.el-main {background-color: #E9EEF3;color: #333;text-align: center;padding: 0px !important;}</style><!-- Place this tag in your head or just before your close body tag. --><script src="https://buttons.github.io/buttons.js"></script><script src="https://cdn.bootcss.com/vue/2.5.13/vue.min.js"></script><script src="https://cdn.bootcss.com/element-ui/2.0.11/index.js"></script><script src="https://cdn.bootcss.com/axios/0.17.1/axios.min.js"></script>
</head>
<body>
<div id="app"><el-container><el-headerstyle="height: 90px!important;"><!-- Place this tag where you want the button to render. --><p><a class="github-button" href="https://github.com/mojocn/base64captcha" data-size="large"data-show-count="true" aria-label="Star mojocn/base64captcha on GitHub">Star</a><!-- Place this tag where you want the button to render. --><a class="github-button" href="https://github.com/mojocn" data-size="large" data-show-count="true"aria-label="Follow @mojocn on GitHub">Follow @mojocn</a><a class="github-button" href="https://github.com/JJJJJJJerk" data-size="large" data-show-count="true"aria-label="Follow @mojocn on GitHub">Follow @Eric Zhou</a><!-- Place this tag where you want the button to render. --><a class="github-button" href="https://github.com/mojocn/base64captcha/issues" data-size="large"data-show-count="true" aria-label="Issue mojocn/base64captcha on GitHub">Issue</a><!-- Place this tag where you want the button to render. --><a class="github-button" href="https://github.com/mojocn/base64captcha/archive/master.zip"data-size="large" aria-label="Download mojocn/base64captcha on GitHub">Download</a></p><a href="https://godoc.org/github.com/mojocn/base64Captcha" rel="nofollow"><imgsrc="https://camo.githubusercontent.com/600bdcf87a3b63b5300c6673401901196360a82a/68747470733a2f2f676f646f632e6f72672f6769746875622e636f6d2f6d6f6a6f636e2f626173653634436170746368613f7374617475732e737667"alt="GoDoc" data-canonical-src="https://godoc.org/github.com/mojocn/base64Captcha?status.svg"style="max-width:100%;"></a><a href="https://goreportcard.com/report/github.com/mojocn/base64Captcha" rel="nofollow"><imgsrc="https://camo.githubusercontent.com/0848346ead4693b8b2d975d8cbbb032945fb708d/68747470733a2f2f676f7265706f7274636172642e636f6d2f62616467652f6769746875622e636f6d2f6d6f6a6f636e2f62617365363443617074636861"alt="Go Report Card"data-canonical-src="https://goreportcard.com/badge/github.com/mojocn/base64Captcha"style="max-width:100%;"></a><a href="http://golangfoundation.org" rel="nofollow"><imgsrc="https://camo.githubusercontent.com/36f4996a1c92724272c100659936593ff0909a29/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f476f6c616e672d466f756e646174696f6e2d677265656e2e737667"alt="Foundation" data-canonical-src="https://img.shields.io/badge/Golang-Foundation-green.svg"style="max-width:100%;"></a><a href="https://codecov.io/gh/mojocn/base64Captcha"><img src="https://codecov.io/gh/mojocn/base64Captcha/branch/master/graph/badge.svg"/></a><a href="http://doge.mit-license.org"><imgsrc="https://camo.githubusercontent.com/3d7aa1ddbfa86368152bf42123c17b69ea8070be/687474703a2f2f696d672e736869656c64732e696f2f3a6c6963656e73652d6d69742d626c75652e737667"alt="License" data-canonical-src="http://img.shields.io/:license-mit-blue.svg"style="max-width:100%;"></a><a href="https://camo.githubusercontent.com/69f50fbca17d6577018651ff9afcb55cdac03bc4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73746162696c6974792d737461626c652d627269676874677265656e2e737667"target="_blank"><imgsrc="https://camo.githubusercontent.com/69f50fbca17d6577018651ff9afcb55cdac03bc4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73746162696c6974792d737461626c652d627269676874677265656e2e737667"alt="stability-stable"data-canonical-src="https://img.shields.io/badge/stability-stable-brightgreen.svg"style="max-width:100%;"></a></p></el-header><el-main><el-row style="width: 50%;margin:8px auto;background: #9e9e9e;padding: 8px 2rem" type="flex"justify="center" align="middle"><el-col :span="16"><img @click.prevent="generateCaptcha" :src="blob" class="captcha-img"v-if="form.CaptchaType !== 'audio'"/><audio controls :src="blob" autoplay v-if="form.CaptchaType === 'audio'"/></el-col><el-col :span="8"><el-form><el-form-item><el-inputtype="text"v-model="form.VerifyValue"auto-complete="off"style="margin: 0 auto 8px auto"placeholder="input your captcha numbers"></el-input></el-form-item><el-form-item><el-buttontype="primary"style="width:100%"v-loading="loading"@click.native.prevent="submitForm">Verify Captcha</el-button></el-form-item></el-form></el-col></el-row><el-tabs v-model="form.CaptchaType"style="width: 70%;margin-left: auto;margin-right: auto;"type="border-card" @tab-click="handleClick"><el-tab-pane label="DriverDigit" name="digit"><el-formlabel-width="280px"label-position="left"><el-form-item label="DriverDigit.Length"><el-slider v-model="form.DriverDigit.Length" :min="1" :max="10" show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverDigit.Width"><el-slider v-model="form.DriverDigit.Width" :min="20" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverDigit.Height"><el-slider v-model="form.DriverDigit.Height" :min="20" :max="180" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverDigit.MaxSkew"><el-slider v-model="form.DriverDigit.MaxSkew" :step="0.05" :min="0.1" :max="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverDigit.DotCount"><el-slider v-model="form.DriverDigit.DotCount" :min="2" :max="100" show-input@change="generateCaptcha"></el-slider></el-form-item></el-form></el-tab-pane><el-tab-pane label="DriverString" name="string"><el-formlabel-width="280px"label-position="left"><el-form-item label="DriverString.Length"><el-slider v-model="form.DriverString.Length" :min="1" :max="10" show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverString.Source"><el-input v-model.trim="form.DriverString.Source"type="textarea"placeholder="Any Unicode string is OK, Korean Japanese Greek Arabic Thai ..."@change="generateCaptcha"></el-input></el-form-item><el-form-item label="DriverString.Width"><el-slider v-model="form.DriverString.Width" :min="20" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverString.Height"><el-slider v-model="form.DriverString.Height" :min="20" :max="180" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverString.NoiseCount"><el-slider v-model="form.DriverString.NoiseCount" :min="0" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverString.ShowLineOptions"><el-checkbox-group v-model="form.ShowLineOptions" @change="generateCaptcha"><el-checkbox label="2">OptionShowHollowLine</el-checkbox><el-checkbox label="4">OptionShowSlimeLine</el-checkbox><el-checkbox label="8">OptionShowSineLine</el-checkbox></el-checkbox-group></el-form-item><el-form-item label="DriverString.Fonts"><el-checkbox-group v-model="form.DriverString.Fonts" @change="generateCaptcha"><el-checkbox v-for="f in fonts" :label="f" :key="f">{{f}}</el-checkbox></el-checkbox-group></el-form-item><el-form-item label="DriverString.BgColor."><el-form-item label="R"><el-slider v-model="form.DriverString.BgColor.R" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="G"><el-slider v-model="form.DriverString.BgColor.G" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="B"><el-slider v-model="form.DriverString.BgColor.B" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="A"><el-slider v-model="form.DriverString.BgColor.A" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item></el-form-item></el-form></el-tab-pane><el-tab-pane label="DriverMath" name="math"><el-formlabel-width="280px"label-position="left"><el-form-item label="DriverMath.Width"><el-slider v-model="form.DriverMath.Width" :min="20" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverMath.Height"><el-slider v-model="form.DriverMath.Height" :min="20" :max="180" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverMath.NoiseCount"><el-slider v-model="form.DriverMath.NoiseCount" :min="0" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverMath.ShowLineOptions"><el-checkbox-group v-model="form.ShowLineOptions" @change="generateCaptcha"><el-checkbox label="2">OptionShowHollowLine</el-checkbox><el-checkbox label="4">OptionShowSlimeLine</el-checkbox><el-checkbox label="8">OptionShowSineLine</el-checkbox></el-checkbox-group></el-form-item><el-form-item label="DriverMath.Fonts"><el-checkbox-group v-model="form.DriverMath.Fonts" @change="generateCaptcha"><el-checkbox v-for="f in fonts" :label="f" :key="f">{{f}}</el-checkbox></el-checkbox-group></el-form-item><el-form-item label="DriverMath.BgColor."><el-form-item label="R"><el-slider v-model="form.DriverMath.BgColor.R" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="G"><el-slider v-model="form.DriverMath.BgColor.G" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="B"><el-slider v-model="form.DriverMath.BgColor.B" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="A"><el-slider v-model="form.DriverMath.BgColor.A" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item></el-form-item></el-form></el-tab-pane><el-tab-pane label="DriverChinese" name="chinese"><el-formlabel-width="280px"label-position="left"><el-form-item label="DriverChinese.Length"><el-slider v-model="form.DriverChinese.Length" :min="1" :max="10" show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverChinese.Source"><el-input v-model.trim="form.DriverChinese.Source"type="textarea"placeholder="可以是英文逗號分隔的詞組"@change="generateCaptcha"></el-input></el-form-item><el-form-item label="DriverChinese.Width"><el-slider v-model="form.DriverChinese.Width" :min="20" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverChinese.Height"><el-slider v-model="form.DriverChinese.Height" :min="20" :max="180" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverChinese.NoiseCount"><el-slider v-model="form.DriverChinese.NoiseCount" :min="0" :max="480" :step="5"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverChinese.ShowLineOptions"><el-checkbox-group v-model="form.ShowLineOptions" @change="generateCaptcha"><el-checkbox label="2">OptionShowHollowLine</el-checkbox><el-checkbox label="4">OptionShowSlimeLine</el-checkbox><el-checkbox label="8">OptionShowSineLine</el-checkbox></el-checkbox-group></el-form-item><el-form-item label="DriverChinese.Fonts"><el-checkbox-group v-model="form.DriverChinese.Fonts" @change="generateCaptcha"><el-checkbox v-for="f in fonts" :label="f" :key="f">{{f}}</el-checkbox></el-checkbox-group></el-form-item><el-form-item label="DriverChinese.BgColor."><el-form-item label="R"><el-slider v-model="form.DriverChinese.BgColor.R" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="G"><el-slider v-model="form.DriverChinese.BgColor.G" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="B"><el-slider v-model="form.DriverChinese.BgColor.B" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="A"><el-slider v-model="form.DriverChinese.BgColor.A" :min="0" :max="254" :step="1"show-input@change="generateCaptcha"></el-slider></el-form-item></el-form-item></el-form></el-tab-pane><el-tab-pane label="DriverAudio" name="audio"><el-formlabel-width="280px"label-position="left"><el-form-item label="DriverAudio.Length"><el-slider v-model="form.DriverAudio.Length" :min="1" :max="10" show-input@change="generateCaptcha"></el-slider></el-form-item><el-form-item label="DriverAudio.Language"><el-radio-group v-model="form.DriverAudio.Language" @change="generateCaptcha"><el-radio-button label="en"></el-radio-button><el-radio-button label="zh"></el-radio-button><el-radio-button label="ru"></el-radio-button><el-radio-button label="ja"></el-radio-button></el-radio-group></el-form-item></el-form></el-tab-pane></el-tabs></el-main><el-footerstyle="line-height: 60px;margin-top: 1rem"> https://github.com/dejavuzhou/felix<a href="https://github.com/mojocn" type="success">https://github.com/mojocn</a><a href="https://mojotv.cn" type="success">Golang Tech Blog </a></el-footer></el-container></div>
</body><script>new Vue({el: '#app',data: function () {return {fonts: ["3Dumb.ttf","ApothecaryFont.ttf","Comismsh.ttf","DENNEthree-dee.ttf","DeborahFancyDress.ttf","Flim-Flam.ttf","RitaSmith.ttf","actionj.ttf","chromohv.ttf","wqy-microhei.ttc",],form: {ShowLineOptions: [],CaptchaType: "string",Id: '',VerifyValue: '',DriverAudio: {Length: 6,Language: 'zh'},DriverString: {Height: 60,Width: 240,ShowLineOptions: 0,NoiseCount: 0,Source: "1234567890qwertyuioplkjhgfdsazxcvbnm",Length: 6,Fonts: ["wqy-microhei.ttc"],BgColor: {R: 0, G: 0, B: 0, A: 0},},DriverMath: {Height: 60,Width: 240,ShowLineOptions: 0,NoiseCount: 0,Length: 6,Fonts: ["wqy-microhei.ttc"],BgColor: {R: 0, G: 0, B: 0, A: 0},},DriverChinese: {Height: 60,Width: 320,ShowLineOptions: 0,NoiseCount: 0,Source: "設想,你在,處理,消費者,的音,頻輸,出音,頻可,能無,論什,么都,沒有,任何,輸出,或者,它可,能是,單聲道,立體聲,或是,環繞立,體聲的,,不想要,的值",Length: 2,Fonts: ["wqy-microhei.ttc"],BgColor: {R: 125, G: 125, B: 0, A: 118},},DriverDigit: {Height: 80,Width: 240,Length: 5,MaxSkew: 0.7,DotCount: 80}},blob: "",loading: false}},computed: {DriverStringSequencedCharacters: {get: function () {return this.form.DriverString.SequencedCharacters.join(',')},set: function (newValue) {this.form.DriverString.SequencedCharacters = newValue.split(',')}}},methods: {doShowLineOptions(val) {if (val > 0) {this.ShowLineOptions = this.form.ShowLineOptions | val;} else {}},formatTooltip: function (val) {var items = ['CaptchaModeNumber', 'CaptchaModeAlphabet', 'CaptchaModeArithmetic','CaptchaModeNumberAlphabet', 'CaptchaModeChinese', 'CaptchaModeUseSequencedCharacters'];return items[val];},handleClick: function (tab, event) {this.generateCaptcha();},generateCaptcha: function () {this.loading = true;//generate uuid string so the serve can verify numbers in the png//you can generate the captchaId in other wayvar that = this;var opt = 0;this.form.ShowLineOptions.forEach(item => {opt = opt | item;});this.form.DriverString.ShowLineOptions = opt;this.form.DriverMath.ShowLineOptions = opt;//this.form.DriverChineseWords.ShowLineOptions = opt;// the api/getCaptcha endpoint only recieve captchaId paramenteraxios.post('/api/getCaptcha', that.form).then(function (response) {that.loading = false;that.form.Id = response.data.captchaId;that.blob = response.data.data;}).catch(function (error) {that.loading = false;that.$notify({title: 500,message: 'net work or server error',type: "error"});});},submitForm: function () {var that = this;this.loading = true;axios.post('/api/verifyCaptcha', that.form).then(function (response) {that.loading = false;that.$notify({title: response.data.msg,message: response.data.data,type: response.data.code});if (response.data.code === "success") {that.generateCaptcha(false)}}).catch(function (error) {that.loading = false;that.$notify({title: 500,message: 'net work or server error',type: "error"});});}},mounted: function () {this.generateCaptcha()}})</script>
</html>

效果

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

適用場景

  • 用戶登錄:防止暴力破解密碼。
  • 注冊驗證:確保注冊用戶為真人操作。
  • 敏感操作:如修改密碼、支付等操作前的二次驗證。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/83469.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/83469.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/83469.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

制作大風車動畫

這個案例的風車旋轉應用了圖形變換來實現&#xff0c;速度和縮放比例應用slider來實現&#xff0c;其中圖片的速度&#xff0c;圖片大小的信息通過State來定義變量管理&#xff0c;速度和和縮放比例的即時的值通過Prop來管理。 1. 案例效果截圖 2. 案例運用到的知識點 2.1. 核…

代碼隨想錄算法訓練營第四十二四十三天

LeetCode/卡碼網題目: 42. 接雨水84. 柱狀圖中最大的矩形98. 所有可達路徑 其他: 今日總結 往期打卡 42. 接雨水 跳轉: 42. 接雨水 學習: 代碼隨想錄公開講解 問題: 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能…

SEO 優化實戰:ZKmall模板商城的 B2C商城的 URL 重構與結構化數據

在搜索引擎算法日益復雜的今天&#xff0c;B2C商城想要在海量信息中脫穎而出&#xff0c;僅靠優質商品和營銷活動遠遠不夠。ZKmall模板商城以實戰為導向&#xff0c;通過URL 重構與結構化數據優化兩大核心策略&#xff0c;幫助 B2C 商城實現從底層架構到搜索展示的全面升級&…

Linux自有服務

自有服務概述 概述 自有服務&#xff0c;即不需要用戶獨立去安裝的軟件的服務&#xff0c;而是當系統安裝好之后就可以直接使用的服務&#xff08;內置&#xff09; 顯示服務 顯示服務 命令&#xff1a;systemctl \[選項] 選項參數 list-units --type service --all&#x…

ZYNQ Overlay硬件庫使用指南:用Python玩轉FPGA加速

在傳統的FPGA開發中,硬件設計需要掌握Verilog/VHDL等硬件描述語言,這對軟件開發者而言門檻較高。Xilinx的PYNQ框架通過Overlay硬件庫徹底改變了這一現狀——開發者只需調用Python API即可控制FPGA的硬件模塊,實現硬件加速與靈活配置。本文將深入探討ZYNQ Overlay的核心概念、…

JavaScript入門【1】概述

1.JavaScript是什么? <font style"color:rgb(38,38,38);">Javascript &#xff08;簡稱“JS”&#xff09;是?種直譯式腳本語?&#xff0c;?段腳本其實就是?系列指令&#xff0c;計算機通過這些指令來達成?標。它?是?種動態類型的編程語?。JS?來在?…

c++從入門到精通(五)--異常處理,命名空間,多繼承與虛繼承

異常處理 棧展開過程&#xff1a; 棧展開過程沿著嵌套函數的調用鏈不斷查找&#xff0c;直到找到了與異常匹配的catch子句為止&#xff1b;也可能一直沒找到匹配的catch&#xff0c;則退出主函數后查找過程終止。棧展開過程中的對象被自動銷毀。 在棧展開的過程中&#xff0c…

自適應稀疏核卷積網絡:一種高效靈活的圖像處理方案

自適應稀疏核卷積網絡&#xff1a;一種高效靈活的圖像處理方案 引言 在深度學習的大潮中&#xff0c;計算機視覺技術取得了長足的進步。其中&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;作為圖像處理的核心工具&#xff0c;極大地推動了各類圖像識別任務的效果提升。…

Nginx:利用 FreeSSL 申請(Https)免費證書的技術指南

1、簡述 在現代互聯網應用中,使用 HTTPS 連接是確保數據傳輸安全的基本需求。SSL/TLS 證書能夠加密客戶端與服務器之間的通信,防止中間人攻擊等安全隱患。而許多開發者和小型企業可能會擔心 SSL 證書的費用問題。幸運的是,FreeSSL 提供了一個簡單易用的平臺,允許我們申請免…

自定義庫模塊增加自定義許可操作詳細方法

自定義庫模塊增加自定義許可操作詳細方法 用到的工具: 后面程序用到的所有代碼均是該工具生成的秘密&#xff01;&#xff01;&#xff01;&#xff01; 【切記切記&#xff01;&#xff01;&#xff01; 一定要記住密碼&#xff0c;不然如果你想將庫的許可認證移除&#xf…

python的漫畫網站管理系統

目錄 技術棧介紹具體實現截圖![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/0ed2084038144499a162b3fb731a5f37.png)![在這里插入圖片描述](https://i-blog.csdnimg.cn/direct/a76a091066f74a80bf7ac1be489ae8a8.png)系統設計研究方法&#xff1a;設計步驟設計流程核…

Python循環性腳本實踐要點:打造穩定高效的定時任務

在Python開發中&#xff0c;循環性腳本&#xff08;長時間運行并定期執行任務的腳本&#xff09;非常常見&#xff0c;比如監控系統、數據采集程序、定時清理任務等。這類腳本雖然看似簡單&#xff0c;但實際開發中容易遇到各種陷阱。本文將分享六大核心實踐要點&#xff0c;幫…

編程基礎:什么是變量

文章目錄 變量&#xff1a;雙要素變量必須代表一個意義&#xff1a;編程不需要無意義的變量。只要是變量&#xff0c;都需要有一個意義。變量必須要有不同的值&#xff1a;編程不需要只有一個值的變量。只要是變量&#xff0c;都需要有不同的值。 雙要素少一個都不是變量即看見…

利用SenseGlove觸覺手套開發XR手術訓練體驗

VirtualiSurg和VR觸覺 作為領先的培訓平臺&#xff0c;VirtualiSurg自2017年以來一直利用擴展現實 (XR) 和觸覺技術&#xff0c;為全球醫療保健行業提供個性化、數據驅動的學習解決方案。該平臺賦能醫療專業人員進行協作式學習和培訓&#xff0c;提升他們的技能&#xff0c;使…

【記錄】Windows|豎屏怎么調整分辨率使橫豎雙屏互動鼠標絲滑

本文版本&#xff1a;Windows11&#xff0c;記錄一下&#xff0c;我最后調整的比較舒適的分辨率是800*1280。 文章目錄 第一步 回到桌面第二步 右鍵桌面第三步 設置橫屏為主顯示器第四步 調整分辨率使之符合你的需求第五步 勾選輕松在顯示器之間移動光標第六步 拖動屏幕符合物理…

手機打電話時如何將通話對方的聲音在手機上識別成文字

手機打電話時如何將通話對方的聲音在手機上識別成文字 --本地AI電話機器人 上一篇&#xff1a;手機打電話時由對方DTMF響應切換多級IVR語音應答&#xff08;一&#xff09; 下一篇&#xff1a;手機打電話時由對方DTMF響應切換多級IVR語音應答&#xff08;二&#xff09; 一、…

uniapp-商城-61-后臺 新增商品(添加商品到數據庫)

完成商品的布局&#xff0c;完成商品的屬性添加&#xff0c;最后的目的還是要完成數據添加&#xff0c;將我們前臺的數據添加后臺的數據庫。 1、界面 2、點擊提交完成商品添加 點擊下方的提交按鈕&#xff0c;將數據添加到數據庫。 onSubmit 使用該函數---見3 <view cla…

A級、B級弱電機房數據中心建設運營匯報方案

該方案圍繞A 級、B 級弱電機房數據中心建設與運營展開,依據《數據中心設計規范》等標準,施工范圍涵蓋 10 類機房及配套設施,采用專業化施工團隊與物資調配體系,強調標簽規范、線纜隱藏等細節管理。運營階段建立三方協同運維模式,針對三級故障制定30 分鐘至 1 小時響應機制…

RAG數據處理:PDF/HTML

RAG而言用戶輸入的數據通常是各種各樣文檔&#xff0c;本文主要采用langchain實現PDF/HTML文檔的處理方法 PDF文檔解析 PDF文檔很常見格式&#xff0c;但內部結構常常較復雜&#xff1a; 復雜的版式布局多樣的元素&#xff08;段落、表格、公式、圖片等&#xff09;文本流無…

時源芯微| KY鍵盤接口靜電浪涌防護方案

KY鍵盤接口靜電浪涌防護方案通過集成ESD保護元件、電阻和連接鍵&#xff0c;形成了一道有效的防護屏障。當鍵盤接口受到靜電放電或其他浪涌沖擊時&#xff0c;該方案能夠迅速將過電壓和過電流引導至地&#xff0c;從而保護后續電路免受損害。 ESD保護元件是方案中的核心部分&a…