go+vue+wails写一个简单的密码加密器

news2024/11/26 21:06:12

git仓库

gitee: malred/password-generator-wails-vue
gitee: malred/password-generator-wails-vue

github: https://github.com/malred/password-generator-wails-vue

wails是什么

我们用它来套壳前端项目(vue),打包成桌面端

思路

提供一个输入框(input),然后获取用户输入的字符串,通过select标签提供加密算法选项,点击生成按钮,根据选择的加密算法来给input里的字符串加密,然后在最底部显示加密结果

项目准备

wails安装

确保你的go版本在1.18及以上

go install github.com/wailsapp/wails/v2/cmd/wails@latest

创建项目

wails init -n password-generator -t vue

app.go

定义了结构体App,当编译的时候,wails会自动把App结构体上的方法转为js方法,可以供前端使用
比如这里的Greet方法

在frontend/wailsjs/go/main/App.js里可以看到对应的方法

vue部分

因为项目比较简单,我们的代码都写在app.vue

template 模板

一个input框,一个select选择,一个按钮
<template>
  <div class="container">
    <input
      type="text"
      v-model="inp"
      placeholder="Input your password to encrypt"
    />
    <br />
    <select name="alg" id="alg" v-model="sel">
      <option :value="v" v-for="v in crypto" :key="v">{{ v }}</option>
    </select>
    <br />
    <button @click="Gen">Generator!</button>
    <br />
    <div>{{ genStr }}</div>
  </div>
</template>

script 脚本

<script setup>
import crypto from './crypto'
import { ref } from 'vue'
// App.go定义后被编译为js可以调用的方法 import { MD5, Sha1, HMAC_SHA256 } from '../wailsjs/go/main/App'
// 选择框的值 const sel = ref('sha1')
// 输入框的值 const inp = ref('')

// 加密后的字符串 let genStr = ref('')

// 点击按钮触发 const Gen = () => {
  // 如果inp框里没有输入值   if (!inp.value) {
    return
  }
  // 判断选择了什么加密方式并加密   // console.log(sel.value)   if (sel.value === 'md5') {
    MD5(inp.value).then(res => {
      genStr.value = res
    })
  } else if (sel.value === 'sha1') {
    Sha1(inp.value).then(res => {
      genStr.value = res
    })
  } else if (sel.value === 'HMAC-SHA256') {
    HMAC_SHA256(inp.value).then(res => {
      genStr.value = res
    })
  }
  // 表单数据清空   inp.value = ''
}
</script>

crypto.js

返回一个数组,里面是加密方法的名称
 export default [
    "sha1",
    "md5",
    "HMAC-SHA256"
]

style 风格

<style scoped>
.container {
  text-align: center;
  margin-top: 16rem;
}
select {
  margin-top: 2rem;
  border: none;
  outline: none;
  width: 16rem;
  height: 3rem;
  background-color: #faf1d8;

  font-size: 1.2rem;
  line-height: 1.2rem;
  appearance: none;
  -webkit-appearance: none;
  -moz-appearance: none;
  /* padding-right: 2px; */
  text-align: center;
  box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);

  border-radius: 0.5rem;
}

button {
  background-color: #f2c64f; /* Green */
  border: none;
  color: black;
  border-radius: 0.5rem;
  padding: 3rem 4rem;
  text-align: center;
  text-decoration: none;
  display: inline-block;
  font-size: 1.2rem;
  margin: 4px 2px;
  cursor: pointer;
  -webkit-transition-duration: 0.4s; /* Safari */
  transition-duration: 0.4s;
}
button:hover {
  box-shadow: 0 12px 16px 0 rgba(0, 0, 0, 0.24),
    0 17px 50px 0 rgba(0, 0, 0, 0.19);
}
div {
  color: black;
  font-weight: bold;
  margin-top: 2rem;
}
button {
  margin-top: 2rem;
  position: relative;
  background-color: #4caf50;
  border: none;
  font-size: 12rempx;
  color: #ffffff;
  padding: 1rem;
  width: 200px;
  text-align: center;
  -webkit-transition-duration: 0.4s; /* Safari */
  transition-duration: 0.4s;
  text-decoration: none;
  overflow: hidden;
  cursor: pointer;
}
button:after {
  content: '';
  background: #90ee90;
  display: block;
  position: absolute;
  padding-top: 300%;
  padding-left: 350%;
  margin-left: -20px !important;
  margin-top: -120%;
  opacity: 0;
  transition: all 0.8s;
}
button:active:after {
  padding: 0;
  margin: 0;
  opacity: 1;
  transition: 0s;
}

input {
  outline: none;
  /* background-color: #4368d092; */
  /* padding: 1rem .5rem; */
  border: 1px solid #fff;
  border-radius: 0.5rem;

  background-color: #faf1d8;
  text-indent: 1rem;

  width: 16rem;
  height: 3rem;
  font-size: 1rem;
  font-weight: bold;

  box-shadow: 2px 2px 2px 1px rgba(0, 0, 0, 0.2);
}
input:placeholder-shown {
  /* border: 3px solid rgba(224, 224, 56, 0.762); */
}
input::-webkit-input-placeholder {
  /* color: #2feb2f; */
  font-size: 1rem;
  font-weight: normal;
}
</style>

assets/images/1.png 是从网上下载的图片,作为背景图

在style.css里修改背景图
html {
  /* background-color: rgba(27, 38, 54, 1); */
  background: url('assets/images/1.png') no-repeat; 
  background-size: 100% 100%;
  background-attachment: fixed;
  text-align: center;
  color: white;
}

wails的App.go定义加密算法

package main

import (
	"bytes"
	"context"
	"crypto/aes"
	"crypto/cipher"
	"crypto/hmac"
	"crypto/md5"
	"crypto/sha1"
	"crypto/sha256"
	"encoding/hex"
	"fmt"
)

// App struct type App struct {
	ctx context.Context
}

// NewApp creates a new App application struct func NewApp() *App {
	return &App{}
}

// startup is called when the app starts. The context is saved // so we can call the runtime methods func (a *App) startup(ctx context.Context) {
	a.ctx = ctx
}

// Greet returns a greeting for the given name func (a *App) Greet(name string) string {
	return fmt.Sprintf("Hello %s, It's show time!", name)
}

// md5加密 func (a *App) MD5(str string) string {
	h := md5.New()
	h.Write([]byte(str))
	return hex.EncodeToString(h.Sum(nil))
} 

func (a *App) HMAC_SHA256(str string) string {
	secret := "mysecret"
	data := "data"

	// Create a new HMAC by defining the hash type and the key (as byte array) 	h := hmac.New(sha256.New, []byte(secret))

	// Write Data to it 	h.Write([]byte(data))

	// Get result and encode as hexadecimal string 	sha := hex.EncodeToString(h.Sum(nil))
	return sha
}

// sha1加密 func (a *App) Sha1(data string) string {
	sha1 := sha1.New()
	sha1.Write([]byte(data))
	return hex.EncodeToString(sha1.Sum([]byte("")))
}

编译

如果要先运行看看结果
wail dev
打包
wails build
编译完成后,在根目录的build/bin下就是编译完成的exe

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

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

相关文章

Java虚拟机——类加载机制概述 类加载的时机

在Class文件中描述的各类信息&#xff0c;最终都需要加载到虚拟机中之后才能被运行和使用。本章将会介绍虚拟机如何加载这些Class文件&#xff0c;Class文件中的信息进入到虚拟机后会发生什么变化。类加载机制&#xff1a;Java虚拟机把描述类的数据从Class文件加载到内存&#…

【ArcGIS】shp导入报错ORA-00911无效字符

这个当个问题记录以下&#xff0c;就是shp文件名或者字段名有非正常字符&#xff0c;修改下名称重新导入即可&#xff1b; 直接改shp没法修改字段&#xff0c;会报错&#xff0c;需要先转化为gdb文件&#xff0c;然后在修改

【Spring】Spring AOP入门及实现原理剖析

文章目录 1 初探Aop1.1 何为AOP&#xff1f;1.2 AOP的组成1.2.1 切面(Aspect)1.2.2 连接点(Join Point)1.2.3 切点(Pointcut)1.2.4 通知(Advice) 1.3 AOP的使用场景 2 Spring AOP入门2.1 添加 Spring AOP 框架⽀持2.2 定义切面和切点2.3 定义相关通知 3 Spring AOP实现原理3.1 …

tauri自定义窗口window并实现拖拽和阴影效果

需求说明 由于官方提供的窗口标题并不能实现我的需求&#xff0c;不能很好的实现主题切换的功能&#xff0c;所以根据官方文档实现了一个自定义的窗口&#xff0c;官方文档地址&#xff1a;Window Customization | Tauri Apps 但是实现之后&#xff0c; 没有了窗体拖拽移动的…

linux系统编程-进程

目录 1 程序和进程 1.1 并发 1.3 多道程序设计 1.4 CPU 和 MMU 1.5 进程控制块 PCB 1.6 进程状态 1.7 环境变量 1.8 setenv 函数 2. 进程控制 2.1 fork 函数 2.2 循环创建 n 个子进程 2.3getpid 函数 2.4 getppid 函数 2.5 getuid 函数 2.6 getgid 函数 2.7 进…

分表后mybatis-plus删除操作失效等问题处理

因为重构dao层&#xff0c;问题太多了&#xff0c;于是想着另起一个章节。 3 mybatis封装对象的问题 直接使用mybatis自身的对象&#xff0c;会有问题&#xff0c;他的列表对象会设置一个id&#xff0c;导致后续的工程会出问题 <select id"getStatementDefaultEquation…

基于SpringBoot+vue的银行OA系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

使用Electron包装ruoyi-ui/ruoyi-vue实践总结

背景&#xff1a;最近公司新起的项目&#xff0c;由于工期、资源等原因&#xff0c;采用ruoyi框架快速实现开发&#xff0c;由于需要构建客户端&#xff0c;所以借助electron来实现。 electron 是使用javascript html css来构建跨平台的桌面应用程序。 官网地址&#xff1a;简介…

ModelWhale 基于 AI for Science 助力航遥中心基础设施建设

2023 年 3 月&#xff0c;科技部会同自然科学基金委启动“人工智能驱动的科学研究&#xff08;AI for Science&#xff09;”专项部署工作。科技部新一代人工智能发展研究中心主任赵志耘认为&#xff0c;AI for Science 将突破传统科学研究能力瓶颈&#xff0c;成为全球科研新范…

【2023-07-18】jsvmp逆向profileData

加密逻辑 注册gid需要用到profileData&#xff0c;profileData的加密逻辑是将一个46对键值对的json经过bas64编码后进行des加密&#xff0c;这46对键值对都是环境和设备相关的一些参数&#xff0c;要完整还原profileData还需要将这些参数的生成逻辑进行还原。 变量名说明key…

Python开发项目基于卷积神经网络的车牌识别仿真软件设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

ICASSP2023论文解读|如何检测会议记录中的待办事项?

得益于语音识别技术的发展&#xff0c;人工智能可以帮助人们记录会议&#xff0c;自动检测与会后行动项关联的会议内容&#xff0c;并进行总结。 行动项识别对于管理会后待办任务至关重要。 针对对于行动项识别任务&#xff0c;相关数据集稀缺且规模小。因此&#xff0c;达摩…

酷炫无敌!10分钟学会制作3D园区大屏,职场新人也能秒变大神!

近年来随着大数据的飞速发展&#xff0c;各大行业都进行了一定的产业革新&#xff0c;智慧园区也逐渐进入企业视野并成为主流&#xff0c;不论大小企业&#xff0c;领导老板都要求员工制作出智慧园区的酷炫大屏&#xff0c;不顾及其中的技术难度&#xff0c;只想看到最终成果&a…

2023隐私计算大会亮点前瞻:《隐私计算应用 面向政务场景的应用要求》标准解读预告

7月26日&#xff0c;2023隐私计算大会将于青岛正式扬帆&#xff0c;本次大会将齐聚业内专家大咖共论行业最新进展&#xff0c;洞察未来发展趋势&#xff0c;共同推进隐私计算行业蓬勃发展。 本次大会将正式公开发布《隐私计算应用研究报告&#xff08;2023&#xff09;》、“隐…

J2EEJSP自定义标签库01out标签if标签

目录 一.什么是标签 二.JSP自定义标签库 2.1 JSP标签库是什么 2.2 处理流程 2.3 如何自定义标签 2.4 标签类型 三.开发示例 3.1 out标签 1.创建助手类 2.编写tld&#xff08;标签库的描述&#xff09;文件&#xff0c;&#xff08;必须放在WEB-INF目录或其目录下&a…

LCD—STM32液晶显示(3.NOR FLASH时序结构体)

目录 LCD结构体配置 NOR FLASH时序结构体 FSMC的NOR FLASH初始化结构体 LCD结构体配置 NOR FLASH时序结构体 与控制SRAM时一样&#xff0c;控制FSMC使用NOR FLASH存储器时主要是配置时序寄存器以及控制寄存器&#xff0c;利用ST标准库的时序结构体以及初始化结构体可以很方便地…

第六章:string类

系列文章目录 文章目录 系列文章目录前言为什么学习string类C语言中的字符串ASCIIUnicode**UTF-8**UTF-16UTF-32 GBK 标准库中的string类string类总结 string类的常用接口说明1. string类对象的常见构造2. string类对象的容量操作3. string类对象的访问及遍历操作4. string类对…

亚马逊云科技十年出海经验,为中国企业提供跨越式发展

对于一座优秀的港口而言&#xff0c;不仅要求其所在的地理位置得天独厚以及拥有庞大的货运船舶吞吐量&#xff0c;能否为地区带来良好的发展生态&#xff0c;提供和创造新的就业机会也是重要的考量。对于很多中小企业而言&#xff0c;他们不具备大型企业的体量&#xff0c;在海…

vscode(Better Comments插件)在vue文件中不显示相对应的颜色

解决办法&#xff1a; 1、在.vscode文件下找到 aaron-bond.better-comments-3.0.2 &#xff08;我的路径&#xff1a;C:\Users\cown\.vscode\extensions\aaron-bond.better-comments-3.0.2&#xff09;&#xff0c;后面版本不唯一&#xff0c;根据自身情况辨别 2、进入文件路…

HTTPS概念wireshark分析

目录 密钥&加密算法CA & 数字证书https流程连接流程springboot项目启动httpswireshark分析https流程 密钥&加密算法 密钥&#xff1a;通常是一个字符串或数字&#xff0c;进行加密/解密算法时使用。公钥和私钥都是密钥&#xff0c;只不过一般公钥是对外开放的&…