文档章节

实现邮件发送功能

xjcyxyx
 xjcyxyx
发布于 2014/06/11 10:28
字数 1550
阅读 907
收藏 12
点赞 0
评论 0
  • model类:MailServer.java

package com.mp.model.sys;

public class MailServer {
	String mailServerHost;
	String mailServerPort;
	String mailServerUserName;
	String mailServerPasswor;
	
	String title;
	String content;
	String receiveMail;
	
	
	
 
	public String getReceiveMail() {
		return receiveMail;
	}
	public void setReceiveMail(String receiveMail) {
		this.receiveMail = receiveMail;
	}
	public String getMailServerHost() {
		return mailServerHost;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public void setMailServerHost(String mailServerHost) {
		this.mailServerHost = mailServerHost;
	}
	public String getMailServerPort() {
		return mailServerPort;
	}
	public void setMailServerPort(String mailServerPort) {
		this.mailServerPort = mailServerPort;
	}
	public String getMailServerUserName() {
		return mailServerUserName;
	}
	public void setMailServerUserName(String mailServerUserName) {
		this.mailServerUserName = mailServerUserName;
	}
	public String getMailServerPasswor() {
		return mailServerPasswor;
	}
	public void setMailServerPasswor(String mailServerPasswor) {
		this.mailServerPasswor = mailServerPasswor;
	}
	
	
}

  • 配置文件

generator.properties

mailServerHost=smtp.163.com
mailServerPort=25
mailServerUserName=
mailServerPassword=



BaseGenerator.java

package com.mp.platform.util;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;

import com.mp.util.ConfigurationHelper;

/**
 * 统一配置文件 地址
 */
public class BaseGenerator {

	private final Log logger = LogFactory.getLog(getClass());
	
	@Autowired
	private ConfigurationHelper configurationHelper;
	public String mailServerHost;
	public String mailServerPort;
	public String mailServerUserName;
	public String mailServerPassword;
	
	public String fblServer;
	
	private void init(){
		if(mailServerHost==null){
			mailServerHost = configurationHelper.getProperty("mailServerHost");
		}
		if(mailServerPort==null){
			mailServerPort = configurationHelper.getProperty("mailServerPort");
		}
		if(mailServerUserName==null){
			mailServerUserName = configurationHelper.getProperty("mailServerUserName");
		}
		if(mailServerPassword==null){
			mailServerPassword = configurationHelper.getProperty("mailServerPassword");
		}
		if(fblServer==null){
			fblServer = configurationHelper.getProperty("fblServer");
		}
	}

	public String getMailServerHost() {
		return mailServerHost;
	}

	public void setMailServerHost(String mailServerHost) {
		this.mailServerHost = mailServerHost;
	}

	public String getMailServerPort() {
		return mailServerPort;
	}

	public void setMailServerPort(String mailServerPort) {
		this.mailServerPort = mailServerPort;
	}

	public String getMailServerUserName() {
		return mailServerUserName;
	}

	public void setMailServerUserName(String mailServerUserName) {
		this.mailServerUserName = mailServerUserName;
	}

	public String getMailServerPassword() {
		return mailServerPassword;
	}

	public void setMailServerPassword(String mailServerPassword) {
		this.mailServerPassword = mailServerPassword;
	}

	public String getFblServer() {
		return fblServer;
	}

	public void setFblServer(String fblServer) {
		this.fblServer = fblServer;
	}

}

  • service

/**
  * 服务发送邮件
  * @return
  */
 public int emailsend( MailServer mailServer);

  • serviceimpl

package com.mp.service.sys.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Callable;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import com.mp.common.PageDataUtils;
import com.mp.dao.sys.ISysAccountDao;
import com.mp.model.sys.MailServer;
import com.mp.model.sys.SysAccount;
import com.mp.model.sys.SysInvite;
import com.mp.service.base.impl.BaseServiceImpl;
import com.mp.service.sys.ISysAccountService;
import com.mp.util.Utils;

/**
 * @Description:实现类
 * @author
 * @version 1.0
 * @created
 */
public class SysAccountServiceImpl extends BaseServiceImpl<SysAccount, ISysAccountDao> implements ISysAccountService {
 protected static final String mailMessage = null;
 
 public int emailsend(final MailServer mailServer) {
  int ret=1;
  
  // 正式发送邮件
  try {
   Properties props = new Properties();
   props.put("mail.smtp.host", mailServer.getMailServerHost());//Smtp服务器地址
   props.put("mail.smtp.port", mailServer.getMailServerPort());//需要校验
   props.put("mail.smtp.auth", "true");//需要校验
   Session session = Session.getDefaultInstance(props,
    new Authenticator() {
     protected PasswordAuthentication getPasswordAuthentication() {
      return new PasswordAuthentication(mailServer .getMailServerUserName(), mailServer .getMailServerPasswor());// 登录用户名/密码
     }
    });
   session.setDebug(true);
   MimeMessage mimeMessage = new MimeMessage(session);

   mimeMessage.setFrom(new InternetAddress(mailServer .getMailServerUserName()));
   Multipart multipart = new MimeMultipart();
   mimeMessage.setRecipients(Message.RecipientType.TO, mailServer.getReceiveMail());// 收件人邮件
   mimeMessage.setSubject(mailServer.getTitle(), "GBK");

   // 正文
   MimeBodyPart body = new MimeBodyPart();
   body.setContent(mailServer.getContent(), "text/html;charset=GBK");
   multipart.addBodyPart(body);// 发件内容

   mimeMessage.setContent(multipart);
   mimeMessage.setSentDate(new Date());
   Transport.send(mimeMessage);
  } catch (Exception e) {
   e.printStackTrace();
   ret=-1;
  }
  
//	 ExecutorService exec=Executors.newSingleThreadExecutor();
//	 Future<Integer> future =exec.submit(new MallSendTools(content,receiveMail,props,mailServer));
//	 try {
//	 ret=future.get();
//	 } catch (InterruptedException e) {
//	 e.printStackTrace();
//	 } catch (ExecutionException e) {
//	 e.printStackTrace();
//	 }
//	 exec.shutdown();
  return ret;
 }
}

class MallSendTools implements Callable<Integer>{
 String content; 
 String receiveMail; 
 Properties props; 
 MailServer mailServer;
 int ret=1;
 MallSendTools(String content, String receiveMail, Properties props, final MailServer mailServer){
  this.content=content;
  this.receiveMail=receiveMail;
  this.props=props;
  this.mailServer=mailServer;
 }
 
 private int sendMail() {
  // 正式发送邮件
  try {
   Session session = Session.getDefaultInstance(props,
     new Authenticator() {
      protected PasswordAuthentication getPasswordAuthentication() {
       return new PasswordAuthentication(mailServer .getMailServerUserName(), mailServer .getMailServerPasswor());// 登录用户名/密码
      }
     });
   session.setDebug(true);
   MimeMessage mimeMessage = new MimeMessage(session);

   mimeMessage.setFrom(new InternetAddress(mailServer .getMailServerUserName()));
   Multipart multipart = new MimeMultipart();
   mimeMessage.setRecipients(Message.RecipientType.TO, receiveMail);// 收件人邮件
   mimeMessage.setSubject("激活你的翻部落帐号", "GBK");

   // 正文
   MimeBodyPart body = new MimeBodyPart();
   body.setContent(content, "text/html;charset=GBK");
   multipart.addBodyPart(body);// 发件内容

   mimeMessage.setContent(multipart);
   mimeMessage.setSentDate(new Date());
   Transport.send(mimeMessage);
  } catch (Exception e) {
   e.printStackTrace();
   ret=-1;
  }
  return ret;
 }

 public Integer call() throws Exception {
  return sendMail();
 }
}

  • 功能实现

//邮件内容
 private String mailContent(String email,String ticket){
  StringBuffer content=new StringBuffer();
  content.append("<div id=\"mailContentContainer\" class=\"qmbox qm_con_body_content\"><style> ");
  content.append("	.mmsgLetter	 { width:580px;margin:0 auto;padding:10px;color:#333;background:#fff;border:0px solid #aaa;border:1px solid #aaa\\9;border-radius:5px;-webkit-box-shadow:3px 3px 10px #999;-moz-box-shadow:3px 3px 10px #999;box-shadow:3px 3px 10px #999;font-family:Verdana, sans-serif; } "); 
  content.append("	.mmsgLetter a:link, ");
  content.append("	.mmsgLetter a:visited {	color:#407700; } ");
  content.append("	.mmsgLetterContent {	text-align:left;padding:30px;font-size:14px;line-height:1.5;} ");
  content.append("	.mmsgLetterContent h3	{ color:#000;font-size:20px;font-weight:bold; margin:20px 0 20px;border-top:2px solid #eee;padding:20px 0 0 0;font-family:\"微软雅黑\",\"黑体\", \"Lucida Grande\", Verdana, sans-serif;} ");
  content.append("	.mmsgLetterContent p {	margin:20px 0;padding:0; } ");
  content.append("	.mmsgLetterContent .salutation { font-weight:bold;} ");
  content.append("	.mmsgLetterContent .mmsgMoreInfo { } ");
  content.append("	.mmsgLetterContent a.mmsgButton	 {	display:block;float:left;height:40px;text-decoration:none;text-align:center;cursor:pointer;} ");
  content.append("	.mmsgLetterContent a.mmsgButton	span {	display:block;float:left;padding:0 25px;height:40px;line-height:36px;font-size:14px;font-weight:bold;color:#fff;text-shadow:1px 0 0 #235e00;} ");
  content.append("	.mmsgLetterContent a.mmsgButton:link, ");
  content.append("	.mmsgLetterContent a.mmsgButton:visited { background:#338702 url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_btn.png) no-repeat right -40px; } ");
  content.append("	.mmsgLetterContent a.mmsgButton:link span, ");
  content.append("	.mmsgLetterContent a.mmsgButton:visited span { background:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_btn.png) no-repeat 0 0; } ");
  content.append("	.mmsgLetterContent a.mmsgButton:hover, ");
  content.append("	.mmsgLetterContent a.mmsgButton:active { background:#338702 url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_btn.png) no-repeat right -120px; } ");
  content.append("	.mmsgLetterContent a.mmsgButton:hover span, ");
  content.append("	.mmsgLetterContent a.mmsgButton:active span { background:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_btn.png) no-repeat 0 -80px; } ");
  content.append("	.mmsgLetterInscribe {	padding:40px 0 0;} ");
  content.append("	.mmsgLetterInscribe .mmsgAvatar	{	float:left; } ");
  content.append("	.mmsgLetterInscribe .mmsgName	{ margin:0 0 10px; } ");
  content.append("	.mmsgLetterInscribe .mmsgSender	{ margin:0 0 0 54px;} ");
  content.append("	.mmsgLetterInscribe .mmsgInfo	{ font-size:12px;margin:0;line-height:1.2; } ");
  content.append("	.mmsgLetterHeader	 {	height:23px;background:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_bg_topline.png) repeat-x 0 0; } ");
  content.append("	.mmsgLetterFooter {	margin:16px;text-align:center;font-size:12px;color:#888; text-shadow:1px 0px 0px #eee;} ");
  content.append("	.mmsgLetterClr { clear:both;overflow:hidden;height:1px; } ");
  content.append("	 .mmsgLetterUser { padding:10px 0; } ");
  content.append("	 .mmsgLetterUserItem { padding:0 0 20px 0;} ");
  content.append("	 .mmsgLetterUserAvatar { height:40px;border:1px solid #ccc;padding:2px;display:block;float:left; } ");
  content.append("	 .mmsgLetterUserAvatar img { width:40px;height:40px; } ");
  content.append("	 .mmsgLetterInfo { margin-left:48px; } ");
  content.append("	 .mmsgLetterName { display:block;color:#5fa207;font-weight:bold;margin-left:10px; } ");
  content.append("	 .mmsgLetterDesc { font-size:12px;float:left;height:43px;background:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_chat_right.gif) no-repeat right top; } ");
  content.append("	 .mmsgLetterDesc div{ white-space:nowrap;float:left;height:43px;padding:0 20px;line-height:40px;background:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_chat_left.gif) no-repeat left top; } ");
  content.append("	 .mmsgLetterUser {} ");
  content.append("	 .mmsgLetterAvatar { float:left;} ");
  content.append("	 .mmsgLetterInfo { margin:0 0 0 60px; } ");
  content.append("	 .mmsgLetterNickName { font-size:14px;font-weight:bold;} ");
  content.append("	 .mmsgLetterUin { font-size:12px;color:#666;} ");
  content.append("	 .mmsgLetterUser { padding:10px 0; } ");
  content.append("	 .mmsgLetterUserItem { padding:0 0 20px 0;} ");
  content.append("	 .mmsgLetterUserAvatar { height:40px;border:1px solid #ccc;padding:2px;display:block;float:left; } ");
  content.append("	 .mmsgLetterUserAvatar img { width:40px;height:40px; } ");
  content.append("	 .mmsgLetterInfo { margin-left:48px; } ");
  content.append("</style> ");
  content.append("<div style=\"background-color:#d0d0d0;background-image:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_bg.png);text-align:center;padding:40px;\"> ");
  content.append("	<div class=\"mmsgLetter\" style=\"width:580px;margin:0 auto;padding:10px;color:#333;background-color:#fff;border:0px solid #aaa;border-radius:5px;-webkit-box-shadow:3px 3px 10px #999;-moz-box-shadow:3px 3px 10px #999;box-shadow:3px 3px 10px #999;font-family:Verdana, sans-serif; \"> ");
  content.append("	 <div class=\"mmsgLetterHeader\" style=\"height:23px;background:url(http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_bg_topline.png) repeat-x 0 0;\"> ");
  content.append("	 </div> ");
  content.append("	 <div class=\"mmsgLetterContent\" style=\"text-align:left;padding:30px;font-size:14px;line-height:1.5;\"> ");
  content.append("	 <div> ");
  content.append("	 <p>你好!</p> ");
  content.append("	 <p> ");
  content.append("	 感谢你注册翻部落平台。 <br> ");
  content.append("	 你的登录邮箱为:<a href=\"mailto:"+email+"\" target=\"_blank\">"+email+"</a>。请点击以下链接激活帐号: ");
  content.append("	 </p> ");
  content.append("	 <p style=\"word-wrap:break-word;word-break:break-all;\"> ");
  content.append("	 <a href=\""+ticket+"\" target=\"_blank\">"+ticket+"</a> ");
  content.append("	 </p> ");
  content.append("	 <p> ");
  content.append("	 如果以上链接无法点击,请将上面的地址复制到你的浏览器(如IE)的地址栏激活您的账号。 (该链接在48小时内有效,48小时后需要重新注册) ");
  content.append("	 </p> ");
  content.append("	 </div>	 ");
//	 content.append("	 <div class=\"mmsgLetterInscribe\" style=\"padding:40px 0 0;\"> ");
//	 content.append("	 <img class=\"mmsgAvatar\" src=\"http://weixin.qq.com/zh_CN/htmledition/images/weixin/letter/mmsgletter_2_avatar_01.png\" style=\"float:left;\"> ");
//	 content.append("	 <div class=\"mmsgSender\" style=\"margin:0 0 0 54px;\"> ");
//	 content.append("	 <p class=\"mmsgName\" style=\"margin:0 0 10px;\">Claire Wang</p> ");
//	 content.append("	 <p class=\"mmsgInfo\" style=\"font-size:12px;margin:0;line-height:1.2;\"> ");
//	 content.append("	 微信产品经理<br> ");
//	 content.append("	 <a href=\"mailto:claire1023@qq.com\" style=\"color:#407700;\" target=\"_blank\">claire1023@qq.com</a> ");
//	 content.append("	 </p> ");
//	 content.append("	 </div> ");
//	 content.append("	 </div>	 ");
  content.append("	 </div> ");
  content.append("	 <div class=\"mmsgLetterFooter\" style=\"margin:16px;text-align:center;font-size:12px;color:#888;text-shadow:1px 0px 0px #eee;\"> ");
  content.append("	 </div> ");
  content.append("	</div> ");
  content.append("</div> ");
  content.append("</div> ");
  return content.toString();
 }

//发送邮件
  MailServer mailServer= new MailServer();
  mailServer.setMailServerUserName(baseGenerator.getMailServerUserName());
  mailServer.setMailServerPasswor(baseGenerator.getMailServerPassword());
  mailServer.setTitle("翻部落帐号激活");
  mailServer.setContent(mailContent(sysAccount.getMail(),baseGenerator.getFblServer()+"activateemail?email="+sysAccount.getId()+"&ticket="+ticket));
  mailServer.setReceiveMail(sysAccount.getMail());
  mailServer.setMailServerHost(baseGenerator.getMailServerHost());
  mailServer.setMailServerPort(baseGenerator.getMailServerPort());
  int email = sysAccountService.emailsend(mailServer);

© 著作权归作者所有

共有 人打赏支持
xjcyxyx
粉丝 5
博文 28
码字总数 4019
作品 0
杨浦
高级程序员
初步实现 Mail 插件 —— 发送邮件

本文是《轻量级 Java Web 框架架构设计》的系列博文。 在 Java 应用系统中为了实现邮件发送与收取功能,往往都会选择使用 JavaMail API。但该 API 涉及的内容比较繁琐,概念与细节都比较多,...

黄勇 ⋅ 2013/11/24 ⋅ 12

python之函数

函数 一、背景 在学习函数之前,一直遵循:面向过程编程,即:根据业务逻辑从上到下实现功能,其往往用一长段代码来实现指定功能,开发过程中最常见的操作就是粘贴复制,也就是将之前实现的代...

鹏爱 ⋅ 2017/07/05 ⋅ 0

javaMail 设置邮件回执

javaMail 发送邮件,如果需要对方回执可以使用MimeMessage的 addHeader("Disposition-Notification-To", "1"); 最近做的一个功能是系统自动发送邮件给收件人,需要统计下邮件回执的情况。 我...

润达菜鸟 ⋅ 2013/08/27 ⋅ 0

Winform开发框架之通用短信邮件通知模块

在做Winform项目的时候,一直有一个梦想,就是希望把所有的组件模块组合即可组装成一个完整的项目系统(或者至少可以大部分完成)。在之前介绍的《Winform开发框架之通用附件管理模块》里面介...

walb呀 ⋅ 2017/12/04 ⋅ 0

(十一)Flask 学习 —— 邮件支持

邮件支持 回顾 在近来的几篇教程中,我们一直在与数据库打交道。 今天我们打算让数据库休息下,相反我们今天准备完成网页应用程序中一项重要的功能:能够给用户发送邮件。 在我们小型 microb...

水果糖 ⋅ 2016/02/26 ⋅ 0

Laravel 邮件发送功能实现

背景 近期在接触传说中最优雅的 PHP 框架——Laravel,学习了一下邮件发送功能,在此分享一下,其中,我使用的框架版本为 5.2.45,参考时请注意差别. 对于 ThinkPHP 框架框架的邮件发送可参考...

moTzxx ⋅ 2017/09/02 ⋅ 0

易宝典文章——玩转Office 365中的Exchange Online服务 之十九 怎样实现邮件代理功能

在企业中,常常会遇到这样的需求,老板级别的员工往往没有过多的时间处理大量的邮件,需要秘书或助手帮其处理邮件。如果这些老板能将自己的用户名和密码共享给秘书,那么可能会导致其它很多不...

liulike ⋅ 2016/06/29 ⋅ 0

Windows Azure Cloud Service (27) 在Windows Azure发送邮件(上)

 《Windows Azure Platform 系列文章目录》   许多Web应用都具有发送邮件通知的功能,不管是作为用户注册流程的一部分,还是通知用户一系列重要事件的发生。如果您是一个.NET的开发人员,...

zting科技 ⋅ 2017/04/30 ⋅ 0

在.NET中使用SMTP发送邮件

这是一篇转载,可能对大家很有用啊,放首页看看是否有参考价值。本文提到的方案仍然不能算是完全解决所有问题,最佳的dotNET下通过SMTP(带验证)发送邮件的机制是什么,不知道大家有什么好的...

老朱教授 ⋅ 2017/10/01 ⋅ 0

JavaMail深入体验开发二: JavaMail的体系结构及发送复杂邮件

一 . 电子邮件传输的全过程: 二 . JavaMail 的体系结构与API分类 JavaMail API按其功能划分通常可分为如下三大类: 创建和解析邮件内容的API :Message类是创建和解析邮件的核心API,它的实例...

长平狐 ⋅ 2012/09/03 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部