B069-项目实战-店铺入驻-FastDfs-邮件

news2024/12/24 2:56:43

目录

      • 店铺入驻
        • 课堂笔记
        • data
        • 表结构
        • 自定义业务异常
        • impl
      • 图片上传-fastdfs
        • 应用背景
        • 概念理论
        • 入门案例
        • 项目使用
          • 1.导包
          • 2.添加配置文件
          • 3.导入工具类
          • 4.写接口将工具类暴露给前端使用
          • 5.前端部分
      • 审核邮件通知
        • 1.导入jar包
        • 2.配置
        • 3.发送邮件
        • 邮件激活登录账号

店铺入驻

到平台来注册店铺信息

课堂笔记

1.为什么要店铺入驻?
   节约平台成本
   合作共赢、避免了无畏的竞争
   
2.入驻的方式---到我平台上注册账号
  自己来申请
  平台拓展市场(平台员工帮它申请)
  
3.入驻的详细流程
  A 在入驻页面填写信息
       店铺信息
	   店铺管理员的账号信息
	   (支付相关的信息)
  B 点击入驻(后端生成店铺信息和管理员信息)
  C 有了管理员信息,店铺管理员就可以登录到我后端平台,查看自己待提交的店铺入驻信息
  D 店铺管理员提交审核-->平台小妹来审核店铺入驻信息
  E 审核通过、或者驳回  发送邮件或者短信通知店铺人员
   
  
4.写shop的后端
  表&domain  -》query  -》 mapper (xml) ->service->测试--》controller
  
5.店铺入驻实现细节
  1.在登录页面准备一个店铺入驻按钮,跳转到入驻页面
  2.准备入驻页面  拷贝课件(html、css、js);配置路由
  3.写后台逻辑-对应入驻页面的入驻按钮
    controller
	  需要接收前端数据
	  还要封装返回service的报错信息(自定义异常)
	service
	  a 检查注册用户是否已经存在。如果存在,抛出业务异常,提示已经注册,直接登录
	  b 先保存部门管理员(employee),需要返回主键
	  c 保存店铺(需要设置店铺管理员),需要返回主键
	  d 修改员工信息-->设置shopId
	mapper.xml

data

				shop: {
					name: '',
					tel: '',
					address: '',
					logo:'',
                        
					username:'',
					tel:'',
					phone:'',
					email:'',
					password:'',
					comfirmPassword:''
				},

表结构

在这里插入图片描述

自定义业务异常

//自定义业务异常
public class BusinessException extends RuntimeException {

    public BusinessException(String message) {
        super(message);
    }

    public BusinessException() {
        super();
    }
}

impl

	@Override
    public void settledIn(Shop shop) {

        Employee admin = shop.getAdmin();

        //1.先校验有没有被注册过  通过username phone email
        Employee employee = employeeMapper.loadByUser(admin.getUsername());
        //如果有,提示:你已经入驻过了,请直接登录,{如果忘记密码,请找回密码}
        if(employee != null){
            throw new BusinessException("你已经入驻过了,请直接登录,{如果忘记密码,请找回密码}");
        }
        //2.先保存员工数据 保存之后返回自增id
        employeeMapper.save(admin);

        //3.保存门店数据--》管理员--->返回店铺自增id
        shop.setAdmin(admin);//设置店铺管理员
        shopMapper.save(shop);

        //4.修改管理员门店id
        admin.setShop_id(shop.getId());
        employeeMapper.update(admin);
    }

图片上传-fastdfs

应用背景

在这里插入图片描述

概念理论

见文档

入门案例

见文档

项目使用

1.导包
<dependency>
    <groupId>cn.bestwu</groupId>
    <artifactId>fastdfs-client-java</artifactId>
    <version>1.27</version>
</dependency>
2.添加配置文件

fdfs_client.conf

tracker_server=115.159.217.249:22122
3.导入工具类

FastDfsUtil,见文档

4.写接口将工具类暴露给前端使用

FastDfsController(上传和删除)

package cn.ming.basic.collection;

import cn.ming.basic.util.AjaxResult;
import cn.ming.basic.util.FastDfsUtil;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;

/**
 * 上传文件统一接口
 *  上传接口
 *  删除接口
 *  修改 = 删除 +上传
 */
@RestController
@RequestMapping("/fastDfs")
public class FastDfsController {

    /**
     * 上传接口
     * @param file  使用@RequestPart 申明,可以直接完成空校验
     */
    @PostMapping
    public AjaxResult upload(@RequestPart(value = "file", required = true)
                                     MultipartFile file){
        try {
            //获取扩展名
            String filename = file.getOriginalFilename();
            String extName = filename.substring(filename.lastIndexOf(".")+1);
            System.out.println(extName);

            String path = FastDfsUtil.upload(file.getBytes(), extName);
            return AjaxResult.me().setResultObj(path);
        } catch (IOException e) {
            e.printStackTrace();
            return AjaxResult.me().setMessage("上传失败!"+e.getMessage());
        }
    }

    /**
     * 删除接口
     * @param path  使用@RequestPart 申明,可以直接完成空校验
     */
    @DeleteMapping
    public AjaxResult del(@RequestParam(required = true,value = "path") String path){
        try {
            String pathTmp = path.substring(1); // goup1/xxxxx/yyyy
            String groupName =  pathTmp.substring(0, pathTmp.indexOf("/")); //goup1
            String remotePath = pathTmp.substring(pathTmp.indexOf("/")+1);// /xxxxx/yyyy
            System.out.println(groupName);
            System.out.println(remotePath);


            FastDfsUtil.delete(groupName, remotePath);
            return AjaxResult.me();
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.me().setMessage("删除失败!"+e.getMessage());
        }
    }
}
5.前端部分

element copy上传标签,两个方法,一个回调函数

<el-form-item prop="logo" label="店铺Logo">
	<el-upload
			class="upload-demo"
			action="http://localhost:8080/fastDfs"
			:on-preview="handlePreview"
			:on-remove="handleRemove"
			:on-success="handleSuccess"
			:file-list="fileList"
			list-type="picture">
		<el-button size="small" type="primary">点击上传</el-button>
		<div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div>
	</el-upload>
</el-form-item>

审核邮件通知

在这里插入图片描述
在这里插入图片描述

1.导入jar包

        <!--对邮件的支持jar-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>

2.配置

直接yml里添加配置或者application.Properties配置都可以

# 设置邮箱主机(服务商)
spring.mail.host=smtp.qq.com
# 设置用户名
spring.mail.username=64009120@qq.com
# 设置密码,该处的密码是QQ邮箱开启SMTP的授权码而非QQ密码
spring.mail.password=qzbxiwjfrweecacf
# 必须进行授权认证,它的目的就是阻止他人任意乱发邮件
spring.mail.properties.mail.smtp.auth=true
#SMTP加密方式:连接到一个TLS保护连接
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# mail在spring层级之下
mail:
  host: smtp.qq.com
  username: 513585429@qq.com
  password: pbnfuokppoxxbijd   # 授权码

3.发送邮件

发送简单邮件(不带附件)和复杂邮件(带图片或压缩文件等附件)

@RunWith(SpringRunner.class)
@SpringBootTest(classes = PetApp.class)
public class JavaMailTest {

    @Autowired
    private JavaMailSender javaMailSender;

    @Test
    public void testSimple(){
        SimpleMailMessage mailMessage = new SimpleMailMessage();
        //设置发送人
        mailMessage.setFrom("513585429@qq.com");
        //邮件主题
        mailMessage.setSubject("新型冠状病毒防护指南");
        //邮件内容
        mailMessage.setText("好好在家待着.....");
        //收件人
        mailMessage.setTo("2094701189@qq.com");

        javaMailSender.send(mailMessage);
    }

    @Test
    public void test2() throws Exception{
        //创建复杂邮件对象
        MimeMessage mimeMessage = javaMailSender.createMimeMessage();
        //发送复杂邮件的工具类
        MimeMessageHelper helper = new MimeMessageHelper(mimeMessage,true,"utf-8");
        helper.setFrom("513585429@qq.com");
        helper.setSubject("新型冠状病毒防护指南");
        http://img30.360buyimg.com/popWaterMark/jfs/t1/67988/7/14094/232759/5db64acfE6ab2b09e/38b5cb3dc38b4b1f.jpg"
        helper.setText("<h1>新型冠状病毒防护守则</h1>"+
                "<img src='https://nimg.ws.126.net/?url=http%3A%2F%2Fdingyue.ws.126.net%2F2023%2F0708%2Fe6d4a2a3j00rxh3oa000oc000hs00bvm.jpg&thumbnail=660x2147483647&quality=80&type=jpg' />",true);
        //添加附件
        helper.addAttachment("100002.jpg",new File("D:\\文件存储\\5.图片\\头像\\100002.jpg"));
//        helper.addAttachment("压缩文件", new File("C:\\Users\\hm\\Desktop\\20191010\\2020-02-05-智能商贸-DAY4\\resources\\resources.zip"));
        //收件人
        helper.setTo("2094701189@qq.com");

        javaMailSender.send(mimeMessage);
    }
}

邮件激活登录账号

在这里插入图片描述

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

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

相关文章

Anaconda详细安装和使用

文章目录 Anaconda简介下载安装官网清华镜像 环境变量配置使用pip配置清华镜像下载路径创建新的虚拟环境进入新的虚拟环境在新环境下载需要的依赖包删除虚拟环境&#xff08;依赖包&#xff09; Anaconda 简介 Anaconda是一个用于科学计算和数据分析的开源Python发行版本.它提…

HLS(一)Vivado高层次综合概述

目录 1.什么是FPGA&#xff1f; 1.1 简介 1.2 架构 1.3 FPGA并行方式与处理器对比 2.硬件设计基本概念 2.1 时钟频率 2.2 延迟 2.3 吞吐率 2.4 存储布局 3.高层次综合 3.1 概述 3.2 运算 ​3.3 条件语句 3.3循环 3.5 函数 3.6 动态内存申请 3.7 指针 4.以计算…

Python应用:打造一个简单的爬虫

文章目录 爬虫基本步骤如何发起网页请求requests的安装requests的使用 如何解析拿到的HTML反爬虫与反反爬虫机制进阶http请求头User-Agent 参考文献 爬虫基本步骤 对于一般的爬虫而言&#xff0c;其基本步骤&#xff1a; 找到需要爬取内容的网页URL&#xff1b;打开该网页的检…

【DBA课程-笔记】第 3 章:MongoDB数据库核心知识

内容 一、MongoDB 数据库架构 A. MongoDB数据库体系架构 1. 存储引擎&#xff08;MongoDB Storage Engines&#xff09;&#xff1a; 2. MongoDB 数据逻辑架构 二、MongoDB 存储引擎 A. 查看mongodb服务器的状态 B. 查看引擎信息&#xff08;4.2.1 没有这个命令&#xf…

数据结构(王道)——顺序表的定义

线性表和顺序表的关系&#xff1a; 两种实现方式&#xff1a;静态分配、动态分配 总结&#xff1a;

Node.js 版本管理工具 n 使用指南

Node.js 版本更新很快&#xff0c;目前 node v20.x 已经发布&#xff0c;我们在使用时避免不了会需要切换不同的 Node.js 的版本来使用不同版本的特性。 所以就出现了像 windows 上的 nvm&#xff0c;MacOS 上的 n 工具&#xff0c;本文就介绍一下如何使用 n 管理 Node.js 的版…

Linux专栏(一)——VMware的下载与安装

一、背景 想要学习Linux系统但又不想经历安装双系统复杂的操作&#xff0c;可以试试虚拟机方案。只是虚拟机方案不可以调用GPU就非常的无语&#xff0c;作为初学者学习还是非常不错的&#xff01; 注意&#xff1a;倘若真正转入Linux系统&#xff0c;安装双系统或者单Linux才是…

Vue2配置在methods中的方法属性丢失

Vue2配置在methods中的方法属性丢失 需求 现在有这样一个需求&#xff1a;一个带有搜索建议的搜索框&#xff0c;搜索建议由后端数据请求回来。当搜索框失去焦点时&#xff0c;应该取消搜索&#xff0c;直接使用输入的内容。 实现 实现原理为防抖加取消&#xff1a; //deb…

小程序 wxchart 使用简单入门

官方参考&#xff1a; Example - wxCharts使用说明 Issue #58 xiaolin3303/wx-charts GitHub 引入 地址&#xff1a;GitHub - xiaolin3303/wx-charts: 微信小程序图表charts组件&#xff0c;Charts for WeChat Mini Program 把clone下来的文件里dist下面的wxcharts.js或…

快手直播间数据采集截流软件脚本,实时采集引流精准获取客源【采集脚本+引流技术教程】

脚本功能&#xff1a;可查观众的块手号&#xff0c;二维码&#xff0c;主页&#xff0c;实时的弹幕消息&#xff0c;以及直播间送出的礼物&#xff0c;实时切换榜首的信息。​ 设备需求&#xff1a;电脑 文章的来源&#xff1a;ZZZZ.LA 文章分享者&#xff1a;Linxiaoyu2022 文…

Python微实践 - 诗意书香,宋风雅韵

诗意书香&#xff0c;宋风雅韵&#xff0c;宋代的文人们或婉约&#xff0c;或豪放&#xff0c;为后世留下了不朽的文学遗产 —— 宋词。宋词本质上是用于合乐的歌词&#xff0c;词人在填词时用的曲调名即为词牌。各位读者在中学时期一定对“水调歌头”、“念奴娇”这些词牌名耳…

mybatis-plus 实现自动填充

文章目录 1、自定义实现类 MyMetaObjectHandler2、在entity中标记需要自动填充的属性3、FieldFill中有哪些字段 1、自定义实现类 MyMetaObjectHandler import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apach…

【Python】PyCharm中调用另一个文件的函数或类

&#x1f389;欢迎来到Python专栏~PyCharm中调用另一个文件的函数或类 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文中出现错误&…

SOKIT软件的使用

1.模拟客户端向服务器发送报文 客户端---->TCP连接---->填写数据----->点击“发送” 2.模拟服务器接受报文 服务器---->设置IP地址与端口---->点击TCP侦听 就可以往该地址发送报文信息了

需求分析案例:全局错误码设计

本文介绍了我在一些业务系统中遇到的错误提示问题&#xff0c;以及进行需求分析和设计实现的过程&#xff0c;欢迎进行交流和指点&#xff0c;一起进步。 1、需求起源 作为程序员&#xff0c;或多或少&#xff0c;都经历过如下场景&#xff1a; 场景1&#xff1a; 产品经理&a…

Stable Diffusion 用2D图片制作3D动态壁纸

如果想让我们的2D图片动起来可以使用stable-diffusion-webui-depthmap-script插件在SD中进行加工让图片动起来。 这是一个可以从单个图像创建深度图,现在也可以生成3D立体图像对的插件,无论是并排还是浮雕。生成的结果可在3D或全息设备(如VR耳机或Looking Glass显示器)上查…

LabVIEW和Web Service交互方式?LabVIE本地项目如何发布到互联网上让外网访问

LabVIEW全称Laboratory Virtual Instrument Engineering Workbench&#xff0c; 是一种图形化编程语言(通常称为G语言)&#xff0c;即实验室虚拟仪器集成环境。LabVIEW 经过多年的持续创新&#xff0c;已经从单纯的仪器控制软件发展成为面向设计、测量和控制的综合性图形化开发…

【设计模式】循序渐进的理解观察者模式Spring事件机制的运用

文章目录 1. 概述2.循序渐进的理解观察者模式2.1 观察者模式概念引入2.2.观察者接口抽象2.3 被观察者接口抽象2.4 观察者模式的通用类图2.5.观察者模式的通用代码实现 3.Spring中的事件运用3.1.Spring事件中的几个角色介绍3.2.代码实现 4.总结 1. 概述 观察者模式&#xff08;…

RabbitMQ高阶使用

1. 问题 2. 延时任务 2.1 什么是延时任务 在当前时间往后延迟多少时间执行的任务 2.1.1 和定时任务区别 定时任务有明确的触发时间&#xff0c;延时任务没有定时任务有执行周期&#xff0c;而延时任务在某事件触发后一段时间内执行&#xff0c;没有执行周期定时任务一般执行的…

生命周期函数和wxs脚本

生命周期函数和wxs脚本 1. 生命周期函数1.1. 应用的生命周期函数1.2. 页面的生命周期函数 2. wxs脚本2.1. wxs与JavaScript的关系2.2. wxs内嵌脚本2.3. wxs外联脚本2.4. tips 1. 生命周期函数 1.1. 应用的生命周期函数 应用的生命周期函数&#xff1a;指小程序从启动 -> 运…