共享益——成果展示

news/2024/10/3 14:25:27

共享益——成果展示

页面展示

image
image
image
image
image

前端部分开发代码:

<script setup>
import { User, Lock } from "@element-plus/icons-vue";
import { ElMessage } from "element-plus";
import { ref } from "vue";
import { userRegisterService, userLoginService } from "@/api/user.js";
//控制注册与登录表单的显示, 默认显示注册
const isRegister = ref(false);//用于注册的数据模型
const registerData = ref({username: "",password: "",rePassword: "",
});
//定义函数,清空数据模型的数据
const clearRegisterData = () => {registerData.value = {username: "",password: "",rePassword: "",};
};//自定义确认密码的校验函数
const rePasswordValid = (rule, value, callback) => {if (value == null || value === "") {return callback(new Error("请再次确认密码"));}if (registerData.value.password !== value) {return callback(new Error("两次输入密码不一致"));}
};
//用于注册的表单校验模型
const registerDataRules = ref({username: [{ required: true, message: "请输入用户名", trigger: "blur" },{ min: 5, max: 16, message: "用户名的长度必须为5~16位", trigger: "blur" },],password: [{ required: true, message: "请输入密码", trigger: "blur" },{ min: 5, max: 16, message: "密码长度必须为5~16位", trigger: "blur" },],rePassword: [{ validator: rePasswordValid, trigger: "blur" }],
});
// 调用后台接口完成注册
const register = async () => {let result = await userRegisterService(registerData.value);console.log("result :>> ", result);if (result.code === 0) {alert(result.msg ? result.msg : "注册成功");} else {alert("注册失败");}
};
import { useRouter } from 'vue-router';
import { useTokenStore } from '@/stores/token.js';
const router = useRouter();
const tokenStore = useTokenStore();
// 登录函数
const login = async () => {let result = await userLoginService(registerData.value);//保存tokentokenStore.setToken(result.data)ElMessage.success('登录成功!')router.push('/')
};
</script><template><el-row class="login-page"><el-col :span="12" class="bg"></el-col><el-col :span="6" :offset="3" class="form"><!-- 注册表单 --><!-- 注册表单 --><el-form ref="form" size="large" autocomplete="off" v-if="isRegister" :model="registerData":rules="registerDataRules"><el-form-item><h1>注册</h1></el-form-item><el-form-item prop="username"><el-input :prefix-icon="User" placeholder="请输入用户名" v-model="registerData.username"></el-input></el-form-item><el-form-item prop="password"><el-input :prefix-icon="Lock" type="password" placeholder="请输入密码"v-model="registerData.password"></el-input></el-form-item><el-form-item prop="rePassword"><el-input :prefix-icon="Lock" type="password" placeholder="请输入再次密码"v-model="registerData.rePassword"></el-input></el-form-item><!-- 注册按钮 --><el-form-item><el-button class="button" type="primary" auto-insert-space @click="register">注册</el-button></el-form-item><el-form-item class="flex"><el-link type="info" :underline="false" @click="isRegister = false;clearRegisterData();">← 返回</el-link></el-form-item></el-form><!-- 登录表单 --><el-form ref="form" size="large" autocomplete="off" v-else :model="registerData" :rules="registerDataRules"><el-form-item><h1>登录</h1></el-form-item><el-form-item prop="username"><el-input :prefix-icon="User" placeholder="请输入用户名" v-model="registerData.username"></el-input></el-form-item><el-form-item prop="password"><el-input name="password" :prefix-icon="Lock" type="password" placeholder="请输入密码"v-model="registerData.password"></el-input></el-form-item><el-form-item class="flex"><div class="flex"><el-checkbox>记住我</el-checkbox><el-link type="primary" :underline="false">忘记密码?</el-link></div></el-form-item><!-- 登录按钮 --><el-form-item><el-button class="button" type="primary" auto-insert-space @click="login">登录</el-button></el-form-item><el-form-item class="flex"><el-link type="info" :underline="false" @click="isRegister = true;clearRegisterData();">注册 →</el-link></el-form-item></el-form></el-col></el-row>
</template><style lang="scss" scoped>
/* 样式 */
.login-page {height: 100vh;background-color: #fff;.bg {background: url("@/assets/logo2.png") no-repeat 60% center / 240px auto,url("@/assets/login_bg.jpg") no-repeat center / cover;border-radius: 0 20px 20px 0;}.form {display: flex;flex-direction: column;justify-content: center;user-select: none;.title {margin: 0 auto;}.button {width: 100%;}.flex {width: 100%;display: flex;justify-content: space-between;}}
}
</style>

后端部分开发代码
1.邮箱验证

package com.example.service.Impl;import com.example.mapper.UserMapper;
import com.example.pojo.Result;
import com.example.service.IMailService;
import jakarta.mail.MessagingException;
import jakarta.mail.internet.MimeMessage;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;import java.util.Random;
import java.util.concurrent.TimeUnit;@Service
public class IMailServiceImpl implements IMailService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Autowiredprivate JavaMailSender mailSender;@Value("${spring.mail.username}")private String mailUserName;@Overridepublic Result getCode(String username, String email) {// 非空校验if (null == username || "".equals(username)) return Result.error("账号不能为空!");if (null == email || "".equals(email)) return Result.error("邮箱不能为空!");//        System.out.println(staffNumber);
//        System.out.println(mailAddress);// 账号存在校验String email_user = userMapper.getEmailByUsername(username);
//        System.out.println(email);if (email_user == null) return Result.error("邮箱不存在!");if (!email_user.equals(email)) return Result.error("邮箱不匹配!");ValueOperations<String, String> operations = stringRedisTemplate.opsForValue();String verifyCode = operations.get("verify");// 使用当前时间作为种子值long seed = System.currentTimeMillis();Random random = new Random(seed);
//        if (verifyCode == null) {verifyCode = String.valueOf(random.nextInt(899999) + 100000);//生成短信验证码
//        }// 验证码存入redis并设置过期时间operations.set("verify", verifyCode, 5, TimeUnit.MINUTES);// 编写邮箱内容StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("<html><head><title></title></head><body>");stringBuilder.append("您好<br/>");stringBuilder.append("您的验证码是:").append(verifyCode).append("<br/>");stringBuilder.append("您可以复制此验证码并返回至共享益找回密码页面,以验证您的邮箱。<br/>");stringBuilder.append("此验证码只能使用一次,在");
//        stringBuilder.append(overtime.toString());stringBuilder.append("5分钟内有效。验证成功则自动失效。<br/>");stringBuilder.append("如果您没有进行上述操作,请忽略此邮件。");MimeMessage mimeMessage = mailSender.createMimeMessage();// 发件配置并发送邮件try {MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true);//这里只是设置username 并没有设置host和password,因为host和password在springboot启动创建JavaMailSender实例的时候已经读取了mimeMessageHelper.setFrom(mailUserName);// 用户的邮箱地址mimeMessageHelper.setTo(email);// 邮件的标题mimeMessage.setSubject("邮箱验证-共享益");// 上面所拼接的邮件内容mimeMessageHelper.setText(stringBuilder.toString(), true);mailSender.send(mimeMessage);} catch (MessagingException e) {e.printStackTrace();}return Result.success("获取验证码成功,请查看移步您的邮箱" + email + "查看验证码!");}
}

2。消息处理

package com.example.mapper;import com.example.pojo.Message;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;import java.util.List;@Mapper
public interface MessageMapper {//发送消息,将发送的消息添加到数据库@Insert("INSERT INTO message (id, send_id, receive_id, message, time) VALUES (#{id}, #{sendId}, #{receiveId}, #{message}, now())")void sendMessage(Message message);//根据自己的id查询所有给自己发送过消息的用户id@Select("SELECT DISTINCT send_id FROM message WHERE receive_id = #{id}")List<Integer> findAllSendId(Integer id);//根据自己的id查询所有自己接受到消息的用户id@Select("SELECT DISTINCT receive_id FROM message WHERE send_id = #{id}")List<Integer> findAllReceiveId(Integer id);//根据自己的id查询所有与自己有过会话的用户id 并根据时间排序@Select("""SELECT idFROM(SELECT DISTINCT id ,MAX(time) as timeFROM (SELECT DISTINCT receive_id AS id, MAX(time) as timeFROM messageWHERE send_id = #{id}GROUP BY receive_idUNIONSELECT DISTINCT send_id AS id, MAX(time) as timeFROM messageWHERE receive_id = #{id}GROUP BY send_id) mergedGROUP BY idORDER BY time DESC) mergeORDER BY time DESC""")List<Integer> findAllUserId(Integer id);//根据自己的id和另一个人的id查询所有的消息 并根据时间先后排序@Select("SELECT * FROM message WHERE (send_id = #{myId} AND receive_id = #{otherId}) OR (send_id = #{otherId} AND receive_id = #{myId}) ORDER BY time ASC")List<Message> findAllMessage(Integer myId, Integer otherId);//删除与某个人的全部消息@Delete("DELETE FROM message WHERE (send_id = #{myId} AND receive_id = #{otherId}) OR (send_id = #{otherId} AND receive_id = #{myId})")void deleteAllMessage(Integer myId, Integer otherId);
}

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

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

相关文章

El-Upload组件上传图片并添加水印

背景 有的时候我们需要在上传图片中添加一些水印标识,然后上传至服务器 效果图代码 <template><div class="app"><!-- 需求:1. 点击直接预览图片,而不需要使用dialog2. 上传图片添加水印后才预览图片思路:上传图片文件添加水印。使用watermark…

kube-proxy 流量流转方式

简介 kube-proxy 是 Kubernetes 集群中负责服务发现和负载均衡的组件之一。它是一个网络代理,运行在每个节点上, 用于 service 资源的负载均衡。它有两种模式:iptables 和 ipvs。 iptables iptables 是 Linux 系统中的一个用户空间实用程序,用于配置内核的网络包过滤和网络地…

2024年5月8日

今天学习了web页面顶部栏的使用和连接的使用和跳转,对web页面进行了美化<template><div class="common-layout"><el-container><el-header class="el-header"><img src="../photos/logo.png" width="200"…

Mysql-Mvcc原理

0.背景 在mysql的并发访问中,有几个典型的并发场景:读-读:无需处理,都是读取,不会对数据有影响。写-写:由于都涉及到数据的修改,不可能乱改,所以没有较好的方式来处理,一般都得加锁。读-写:读写场景,加锁当然ok。不过读操作是很频繁的,一但写数据就不让读取了,这种…

软件测试学习之linux学习

今天是第三天,主要学了函数

Shell编程之条件语句

目录1.条件测试2.文件测试与整数测试(1)文件测试(2)整数测试3.字符串测试与逻辑测试(1)字符串测试(2)逻辑测试4.if语句(1)if单分支语句(2)if双分支语句(3)if多分支语句5.case分支语句 1.条件测试 Shell环境根据命令执行后的返回状态值($?)来判断是否执行成功,…

git merge指定提交(commit)

第一种 idea图形化界面操作 1.首先切换到要合并提交的分支上(即没有这些提交的分支) 2. 在git提交log里选有这些提交的分支,并将提交捡出 有多个提交的话就cherry pick多个提交就行,最后一起push 3. git push 下班记得打卡

麒麟 V10 一键安装 Oracle 11GR2(231017)单机版 2

https://www.modb.pro/db/1762008192972820480 安装准备1、安装好操作系统,建议安装图形化 2、配置好网络 3、挂载本地 ISO 镜像源 4、上传必须软件安装包(安装基础包,补丁包:33991024、35574075、35685663、6880880) 5、上传一键安装脚本:OracleShellInstall✨ 偷懒可以…