数据库表的设计:库名 x2mail
1。手机类型适配表:表名 x2_mail_ada
因为发送给用户的xx信件的时候,需要知道该用户手机都支持什么样的铃声
和多大尺寸的图片,所以,需要一个这样的UA适配表:
autoid int (主键,唯一索引,自增)
user_agent varchar (UA信息,不能为空)
img_type_id int (该UA的图片适配号,从图铃列表中取)
img_kind_id int (该UA的图片类型适配,暂时都默认为1,不能为空)注:1-只支持png
2-只支持jpg
3-png,jpg都支持
ring_type_id int (该UA的适配铃声类型号,从图铃类型列表中取)
enable_flag boolean (该手机类型是否启用标示,默认为true)
temp_int int (备用字段,int)
temp_vc varchar (备用字段,varchar)
temp_b boolean (备用字段,boolean)
该表需要手动输入,先输入某个UA,然后从其他途径得到该手机适配的图片大小和铃声类型
再从图铃列表中,得到符合该手机的图片和铃声适配的ID号码,然后进行填写
2. 图铃类型列表: 表名 x2_mail_type
autoid int (主键,唯一索引,自增)
object_type varchar (图,或者铃) PIC RING
type_desc varchar (该UA适配图铃描述:图:尺寸 铃:类型) 130x140 mid40
type_id int (图铃适配号) 自己手动输入
enable_flag boolean (是否启用标示,默认为true)
temp_int int (备用字段,int)
temp_vc varchar (备用字段,varchar)
temp_b boolean (备用字段,boolean)
上面两个表都是要手都输入的,基本是一个静态引用的表,除非有新的UA需要进行添加和适配
3。图铃资源表:表名 x2_mail_src
autoid int (主键,唯一索引,自增)
upload_date varchar (图铃上传时间,发xx业务需要每天的区分)
object_type varchar (图铃类型,pic, ring)
type_id int (图铃适配号)
object_url varchar (图铃URL地址)
object_path varchar (图铃物理地址)
object_name_cn varchar (图铃中文名称)
object_name_en varchar (图铃英文名称)
object_desc varchar (图铃描述)
dir_F int (该图铃主栏目ID)
dir_S int (该图铃栏目ID)
enable_flag boolean (是否启用标示,默认为true)
temp_int int (备用字段,int)
temp_vc varchar (备用字段,varchar)
temp_b boolean (备用字段,boolean)
该表手动添加,主要是一个参照表
4.产品拦目分类表: 表名 x2_mail_dir
autoid int (主键,唯一索引,自增)
dir_F int (主栏目ID)
dir_S int (栏目ID)
dir_name varchar (栏目名称)
dir_desc varchar (栏目描述)
product_id int (如果是上线产品,这里就是该产品业务代码,默认为空)
product_send_date varchar (产品发送时间设定,必须由产品经理来首先定义时间)
online_flag boolean (是否上线栏目,默认为false)
enable_flag boolean (栏目是否启用标示,默认为true)
temp_int int (备用字段,int)
temp_vc varchar (备用字段,varchar)
temp_b boolean (备用字段,boolean)
5.用户定购表: 表名 x2_mail_order
autoid int (主键,唯一索引,自增)
user_mobile_id varchar (用户手机号码)
user_mobile_ua varchar (用户手机UA)
user_status int (用户订购状态,订购?退定?等)
user_date varchar (用户定购或者退定日期)
user_status_date int (用户定购状态,1:本月定购,又退定 ,还是要发完本月的 2:本月退定)
product_id int (该定购或者退定的产品代码)
enable_flag boolean (该用户是否启用标示,默认为false,待轮询查找到该新用户之后,判断其如果
是本月新订购用户,则发送给他一个确认信息邮件,然后将flag置true,如果该
定购字段user_status为退顶状态,则设置该字段为flase)
temp_int int (备用字段,int)
temp_vc varchar (备用字段,varchar)
temp_b boolean (备用字段,boolean)
6。xx产品发送信息表: 表名 x2_mail_content
autoid int (主键,唯一索引,自增)
mail_type varchar (信件产品类型,图,或铃,或咨询 PIC RING 等)
title varchar (信件正文标题,从后台得到)
body varchar (信件正文,从后台得到)
send_date varchar (信件发送日期)
dir_F int (该信件所属主栏目ID)
dir_S int (该信件所属栏目ID)
send_flag boolean (该信件是否已经发送标示,默认为false)
enable_flag boolean (该信件是否启用标示,默认为true)
temp_int int (备用字段,int)
temp_vc varchar (备用字段,varchar)
temp_b boolean (备用字段,boolean)
*************************************************************************************************
*************************************************************************************************
类设计:
---------------------------------------------------------------------------------------------
因为没有做过xx的业务,对于xx业务流程根本不清楚,所以按照下载类的业务流程和定购规范来处理:
---------------------------------------------------------------------------------------------
因为没有xx的相关文档.....所以,都是摸索着进行......
根据猜测需求,如果一个用户定购了某个业务之后,大概10分钟左右收到连通发送的定购
信息,必须在很快的时间内对新用户的业务进行处理,并发送确认定购业务的邮件,然后将该用户放置在
定购关系表中,按照该用户定购业务存放其信息并定时来发送其定购的邮件信息。
******定时监控查询类******
定时(每五分钟)监控并查询数据库表:用户定购表: 表名 x2_mail_order
判断其中的纪录,轮询所有的纪录,对数据库操作频繁而且效率不高,但是
现在只能先这样处理:
主要判断所有记录中:
enable_flag
该用户是否启用标示,默认为false,待轮询查找到该新用户之后,判断其如果
是本月新订购用户,则发送给他一个确认信息邮件,然后将flag置true.
该类将放置在crontab中每隔10分钟调用一次,执行新用户的确认信息处理
public class userCheckStatus(){
private String user_mobile;//用户手机号码
private String user_product_id;//用户定购业务代码
public void judge_user_status(){
//轮循数据库,得到所有订购关系为真的用户,并判断enable_flag,如果为flase,
//发送一个确认邮件给用户
。。。。。。
for(int i=0; i<所有具有定购关系的用户数; i++){
if(user_status订购关系为真 || enable_flag,如果为flase)
{
//取得该用户手机号码,和定购产品名称
。。。。。。
//调用发送邮件程序,发送一封确认定购的邮件给用户
send_confirm_mail(user_mobile, user_product_name);
。。。。。。
//回写数据库表,将该判断字段置false
}
}
}
}
---------------------------------------------------------------------------------------------
******用户类实体对象******
从数据库中用户定购表中将所有有定购关系的用户基本固态信息取出并初始化到一个类变量中等待调用......
而且,按照产品来分类,产品从库中动态取得,现在只有三个产品,所有只有三个分类......
将所用定购用户需要得到的所有固态信息放置到一个内存对象中,然后再由其他对象进行调用
填充该用户定购所需要的一些动态信息比如图铃地址和邮件内容等
将用户类实体对象填充到一个类容器中的时候,可以按照该类实体的产品id号来分成不同的类容器,以供
调用。。。。。。但是因为不能动态的生成类容器,所以只能按照线性的来顺序分类并分发了。。。。。。
public class userInfo(){
private String user_mobile;//用户手机号码
private String user_mobile_ua;//用户手机UA
private String user_type;//用户定购产品类型:下载图、铃,或者是浏览咨询类
private String user_adapte_type_id;//用户该手机适配的图、铃适配号
private String type_desc;//用户该手机适配的图铃适配描述,比如,png图片128*128,铃声mid40
private String user_status;//用户订购状态,订购?退定?等
private int user_product_id;//用户定购产品(栏目)id
private String dir_name;//栏目名称
private String dir_desc;//栏目描述
private String product_send_date;//产品发送时间设定
private String 。。。。。。;/等等
public void initUser(必要的初始化参数){
//从库中中得到所有该用户字段信息,并存储起来以便放置于类容器中
}
}
---------------------------------------------------------------------------------------------
******用户类容器管理类******
该类容器对象将所有类实体对象存储起来,然后产品邮件发送类将会从中提取类实体对象信息,按照产品
分类,现在无法实现将类容器对象按照产品来动态生成,然后填入属于该产品的类实体对象,只能一锅煮
然后,发送之前按照类容器中所有的类对象的产品id来分类分组发送。。。。。。
public class userInfoManager(){
hashtable hashtab_product_send_user;
//初始化类容器
public void init_usermanager(){
userinfo tmp_user_info;
//从库中用户定购表到所有定购用户的手机号,适配号和产品号等关键字段
//select * from 用户定购表 where 用户订购状态==true and 用户是否启用标示==true
where(rs.next()){
//初始化类实体
tmp_user_info.initUser(必要的初始化参数);
//添加到类容器中
hashtab_product_send_user.add(tmp_user_info);
}
}
}
---------------------------------------------------------------------------------------------
******用户发送信息管理类******
该类将从类容器中将所有类实体对象分组,然后发送,每一组起一个发送线程,根据产品ID分布,而且发送时间
也将按照类实体中包含的产品发送时间来处理.
public class sendMailManager(){
Vector product_send_list;
userInfoManager tmp_uM;
public hashtab initUserManager(){
tmp_uM.init_usermanager();
return tmp_uM.hashtab_product_send_user;
}
public void mailSendThreadManager(){
hashtab tmp_hash;
//先初始化用户基本信息构造用户类实体,和初始化用户类容器将类实体填充类容器中
hashtab uManager = initUserManager();
//然后从产品分类库表中取得产品id信息
//select * from product xxxxx
while (product_id is online.next()){
product_id = rs.getLong(xxxx);
for(int i=0; i<uManager.size(); i++){
if(product_id = uManager.getelment(i).getProduct_id()){
tmp_hash.add(uManager.getelment(i));
product_send_list.add(tmp_hash);
}
}
}
//将得到的Vector中的用户按照产品分类的类容器用发送线程类来发送
for(int j=0; j<product_send_list.length(); j++){
threadSendMail.sendMail();//
}
}
}
---------------------------------------------------------------------------------------------
******邮件信息发送线程类******
该类主要开启一个线程来发送归类好的类容器中的邮件,并写发送的log
public class threadSendMail(){
}
---------------------------------------------------------------------------------------------