這段時(shí)間,我仿佛沉浸在了一個(gè)只有代碼與我相伴的靜謐宇宙之中。每一個(gè)星辰璀璨的夜晚,都是我與這些數(shù)字精靈共舞的時(shí)刻,它們?cè)谖抑讣廨p舞,共同編織出一個(gè)個(gè)守護(hù)著用戶隱私的堅(jiān)固城堡——那就是我引以為傲的Bcrypt文本加密工具1.0版本。
在創(chuàng)造這個(gè)城堡的征途中,UI布局的設(shè)計(jì)成了我首先需要攀登的高峰。起初,我試圖借助開源項(xiàng)目的布局作為基石,但那份“拿來主義”的便捷并未帶來我所期望的視覺效果。界面如同迷宮般錯(cuò)綜復(fù)雜,元素間的擁擠讓我深感不滿。于是,我踏上了漫長(zhǎng)而曲折的調(diào)整與優(yōu)化之路。經(jīng)過無數(shù)次推翻與重建,我終于發(fā)現(xiàn)了那塊最適合的拼圖——頂部是簡(jiǎn)潔明了的導(dǎo)航欄,如同燈塔指引方向;中間是工具的主體部分,一目了然,操作便捷;而原本計(jì)劃舍棄的工具說明,也被我巧妙地融入下方,既滿足了SEO的需求,又保持了界面的和諧統(tǒng)一。當(dāng)然,我深知當(dāng)前的介紹部分仍有改進(jìn)的空間,我期待著每一位用戶的寶貴意見與建議,讓我們攜手將它雕琢得更加精致。

然而,挑戰(zhàn)并未就此止步。SEO優(yōu)化的難題緊接著擺在了我的面前。在這個(gè)信息洪流肆虐的時(shí)代,如何讓我的工具在眾多同類產(chǎn)品中脫穎而出,成為用戶搜索時(shí)的首選,是我必須跨越的另一道坎。我深入SEO的海洋,從關(guān)鍵詞的精心挑選到網(wǎng)站結(jié)構(gòu)的細(xì)致規(guī)劃,每一步都力求精準(zhǔn)到位。但遺憾的是,由于我的疏忽,網(wǎng)站在未經(jīng)充分SEO優(yōu)化的情況下便匆匆上線,錯(cuò)過了最佳的曝光時(shí)機(jī)?,F(xiàn)在,我更加珍惜這次優(yōu)化的機(jī)會(huì),希望它能助力我的網(wǎng)站被更多用戶發(fā)現(xiàn),提升在搜索引擎中的排名。同時(shí),我也想借此機(jī)會(huì)提醒那些即將踏上站長(zhǎng)之路的朋友們:一定要將SEO視為網(wǎng)站建設(shè)的基石,提前規(guī)劃、精心布局,以免重蹈我的覆轍。
當(dāng)然,成功的道路上從來都不會(huì)是一帆風(fēng)順的。在測(cè)試的關(guān)鍵時(shí)刻,我遭遇了前所未有的挑戰(zhàn)——幾個(gè)頑固的bug如同暗礁般潛伏在平靜的海面之下,威脅著航行的安全。它們不僅阻礙了工具的正常運(yùn)行,更可能給用戶的數(shù)據(jù)安全帶來隱患。面對(duì)這突如其來的危機(jī),我沒有絲毫的猶豫與退縮,而是毅然決然地投入到了問題的排查與修復(fù)工作中。無數(shù)個(gè)日夜的努力與堅(jiān)持,終于換來了勝利的曙光——那些曾經(jīng)囂張一時(shí)的bug被我一一攻克,工具的穩(wěn)定性和安全性得到了有力的保障。 特別是針對(duì)用戶輸入鹽值過多導(dǎo)致頁面卡死的問題,我通過禁用輸入、顯示加載狀態(tài)并采用異步處理的方式成功解決了這一難題。現(xiàn)在,無論用戶輸入多少鹽值,系統(tǒng)都能穩(wěn)定運(yùn)行并提供及時(shí)反饋。
如今,當(dāng)我再次審視這個(gè)經(jīng)過無數(shù)次迭代與修改終于定型的Bcrypt文本加密工具時(shí),心中不禁涌起一股難以言喻的激動(dòng)與自豪。它不僅是我技術(shù)能力的見證,更是我對(duì)編程事業(yè)熱愛與執(zhí)著的最好詮釋。我深知,這只是一個(gè)新的起點(diǎn),未來的道路上還有無數(shù)的挑戰(zhàn)與機(jī)遇等待著我去探索與征服。但我堅(jiān)信,只要我懷揣著對(duì)技術(shù)的熱愛與對(duì)完美的追求,勇往直前、不懈奮斗,我就一定能夠?qū)⑽业木W(wǎng)站打造得更加出色、更加卓越,成為用戶心中值得信賴的隱私守護(hù)者。
非專業(yè)前端,希望大家多指點(diǎn)一下我的代碼
```
<template>
? <tool-info :tool="tool" :readme="VueComponent">
? ? <template #body>
? ? ? <el-card shadow="never">
? ? ? ? <el-row justify="center">
? ? ? ? ? <el-col :xs="24" :sm="16" :md="16">
? ? ? ? ? ? <el-tabs v-model="activeName" >
? ? ? ? ? ? ? <el-tab-pane :label="$t('tools.bcrypt.tab.hash.title')" name="hash">
? ? ? ? ? ? ? ? <el-form label-width="auto">
? ? ? ? ? ? ? ? ? <el-row>
? ? ? ? ? ? ? ? ? ? <el-col :span="24">
? ? ? ? ? ? ? ? ? ? ? <el-form-item :label="$t('tools.bcrypt.tab.hash.input.text.title')">
? ? ? ? ? ? ? ? ? ? ? ? <el-input v-model="input" @change="handleStringChange" :placeholder="$t('tools.bcrypt.tab.hash.input.text.placeholder')" :disabled="isHashing" type="textarea" :rows="3"/>
? ? ? ? ? ? ? ? ? ? ? </el-form-item>
? ? ? ? ? ? ? ? ? ? ? <el-form-item :label="$t('tools.bcrypt.tab.hash.input.salt.title')">
? ? ? ? ? ? ? ? ? ? ? ? <el-input-number @change="handleSaltChange" v-model="saltCount" :max="100":min="0" style="width: 100%"? :disabled="isHashing"/>
? ? ? ? ? ? ? ? ? ? ? </el-form-item>
? ? ? ? ? ? ? ? ? ? </el-col>
? ? ? ? ? ? ? ? ? </el-row>
? ? ? ? ? ? ? ? ? <el-row>
? ? ? ? ? ? ? ? ? ? <el-col :span="24">
? ? ? ? ? ? ? ? ? ? ? <el-divider />
? ? ? ? ? ? ? ? ? ? ? ? <el-input v-loading="isHashing" @click="copy()" v-model="hashed" readonly? :placeholder="$t('tools.bcrypt.tab.hash.output.placeholder')" type="textarea" :rows="5"/>
? ? ? ? ? ? ? ? ? ? </el-col>
? ? ? ? ? ? ? ? ? </el-row>
? ? ? ? ? ? ? ? </el-form>
? ? ? ? ? ? ? </el-tab-pane>
? ? ? ? ? ? ? <el-tab-pane :label="$t('tools.bcrypt.tab.compare.title')" name="diff">
? ? ? ? ? ? ? ? <el-form label-width="auto">
? ? ? ? ? ? ? ? ? <el-row>
? ? ? ? ? ? ? ? ? ? <el-col :span="24">
? ? ? ? ? ? ? ? ? ? ? <el-form-item :label="$t('tools.bcrypt.tab.compare.input.text.title')">
? ? ? ? ? ? ? ? ? ? ? ? <el-input v-model="compareString" :placeholder="$t('tools.bcrypt.tab.compare.input.text.placeholder')"? type="textarea" :rows="3"/>
? ? ? ? ? ? ? ? ? ? ? </el-form-item>
? ? ? ? ? ? ? ? ? ? ? <el-form-item :label="$t('tools.bcrypt.tab.compare.input.hash.title')">
? ? ? ? ? ? ? ? ? ? ? ? <el-input v-model="compareHash" :placeholder="$t('tools.bcrypt.tab.compare.input.hash.placeholder')" type="textarea" :rows="3"/>
? ? ? ? ? ? ? ? ? ? ? </el-form-item>
? ? ? ? ? ? ? ? ? ? ? <el-form-item :label="$t('tools.bcrypt.tab.compare.output.title')" :show-message="false">
? ? ? ? ? ? ? ? ? ? ? ? <el-alert :title="$t('tools.bcrypt.tab.compare.output.true')" type="success" show-icon? v-if="compareMatch"? :closable="false"/>
? ? ? ? ? ? ? ? ? ? ? ? <el-alert :title="$t('tools.bcrypt.tab.compare.output.false')" type="error" show-icon? v-else? :closable="false"/>
? ? ? ? ? ? ? ? ? ? ? </el-form-item>
? ? ? ? ? ? ? ? ? ? </el-col>
? ? ? ? ? ? ? ? ? </el-row>
? ? ? ? ? ? ? ? </el-form>
? ? ? ? ? ? ? </el-tab-pane>
? ? ? ? ? ? </el-tabs>
? ? ? ? ? </el-col>
? ? ? ? </el-row>
? ? ? </el-card>
? ? </template>
? </tool-info>
</template>
<script setup lang="ts">
import ToolInfo from '@/components/ToolInfo.vue';
import? {VueComponent}? from './README.md';
import BcryptJs from 'bcryptjs';
import { tool } from './index';
import { useCopy } from '@/composables/copy';
import { computed, ref ,nextTick} from 'vue';
const { compareSync, hash } = BcryptJs;
const activeName = ref('hash');
const input = ref('');
const saltCount = ref(0);
const hashed = ref("");
const { copy } = useCopy({ source: hashed });
const compareString = ref('');
const compareHash = ref('');
const compareMatch = computed(() => compareSync(compareString.value, compareHash.value));
// 新增狀態(tài)變量
const isHashing = ref(false);
// 將計(jì)算哈希值的部分改為異步函數(shù)
async function computeHash() {
? await nextTick();
? hash(compareString.value, saltCount.value).then(text =>{
? ? hashed.value = text;
? }).finally(()=>isHashing.value = false);
}
// 更新handleSaltChange以在計(jì)算前后管理isCalculating狀態(tài)
const handleStringChange = async (value: string) => {
? compareString.value = value;
? isHashing.value = true;
? computeHash(); // 調(diào)用異步計(jì)算函數(shù)
};
const handleSaltChange =? async(value: number) => {
? saltCount.value = value;
? isHashing.value = true;
? computeHash(); // 調(diào)用異步計(jì)算函數(shù)
};
</script>
```