1.修改完善已提交的需求规格说明书
需求规格说明书
2.讨论制定团队的编码规范
2.1 包名
使用小写字母如 com.xxx.settlment,不要 com.xxx.Settlement
单词间不要用字符隔开,比如 com.xxx.settlment.jsfutil,而不要com.xxx.settlement.jsf_util
2.2 类名
2.2.1 首字母大写
类名要首字母大写,比如 SupplierService, PaymentOrderAction;不要 supplierService, paymentOrderAction.
2.2.2 后缀
类名往往用不同的后缀表达额外的意思,如下表:
后缀名 意义 举例
Service 表明这个类是个服务类,里面包含了给其他类提同业务服务的方法 PaymentOrderService
Impl 这个类是一个实现类,而不是接口 PaymentOrderServiceImpl
Inter 这个类是一个接口 LifeCycleInter
Dao 这个类封装了数据访问方法 PaymentOrderDao
Action 直接处理页面请求,管理页面逻辑了类 UpdateOrderListAction
Listener 响应某种事件的类 PaymentSuccessListener
Event 这个类代表了某种事件 PaymentSuccessEvent
Servlet 一个Servlet PaymentCallbackServlet
Factory 生成某种对象工厂的类 PaymentOrderFactory
Adapter 用来连接某种以前不被支持的对象的类 DatabaseLogAdapter
Job 某种按时间运行的任务 PaymentOrderCancelJob
Wrapper 这是一个包装类,为了给某个类提供没有的能力 SelectableOrderListWrapper
Bean 这是一个POJO MenuStateBean
2.3 方法名
首字母小写,如 addOrder() 不要 AddOrder()
动词在前,如 addOrder(),不要orderAdd()
动词前缀往往表达特定的含义,如下表:
前缀名 意义 举例
create 创建 createOrder()
delete 删除 deleteOrder()
add 创建,暗示新创建的对象属于某个集合 addPaidOrder()
remove 删除 removeOrder()
init或则initialize 初始化,暗示会做些诸如获取资源等特殊动作 initializeObjectPool
destroy 销毁,暗示会做些诸如释放资源的特殊动作 destroyObjectPool
open 打开 openConnection()
close 关闭 closeConnection()<
read 读取 readUserName()
write 写入 writeUserName()
get 获得 getName()
set 设置 setName()
prepare 准备 prepareOrderList()
copy 复制 copyCustomerList()
modity 修改 modifyActualTotalAmount()
calculate 数值计算 calculateCommission()
do 执行某个过程或流程 doOrderCancelJob()
dispatch 判断程序流程转向 dispatchUserRequest()
start 开始 startOrderProcessing()
stop 结束 stopOrderProcessing()
send 发送某个消息或事件 sendOrderPaidMessage()
receive 接受消息或时间 receiveOrderPaidMessgae()
respond 响应用户动作 responseOrderListItemClicked()
find 查找对象 findNewSupplier()
update 更新对象 updateCommission()
3.数据库设计
ER图
4.项目的后端架构设计
选择通用架构。通用架构设计简洁,通用性强,清晰明了,同时也方便调试。在进行前期开发的时候最为适用
5.确定团队Alpha版本要实现的功能
5.1.功能介绍WBS图
5.2.利用象限法审核上一次作业所确定需求优先级,明确项目的核心功能
5.3.Alpha版本需要实现的功能表格
优先级 | 名称 | 用户故事描述 |
---|---|---|
1 | 公众号所有者团队 | 作为一个公众号所有者团队,这个团队通常由多个管理员组成,可以管理整个产品,以便于给使用者创造更好的体验 |
1 | 管理员 | 作为一个管理员,可以控制产品内容推送和对各个方面进行管理,以便于获得好口碑 |
2 | 读者 | 作为一个读者,可以使用此产品,以便于为生活提供乐趣 |
6.关键技术与难点
6.1. 微信公众号接入
公众号接入由三个步骤组成,分别是填写服务器配置,验证服务器地址的有效性和依据接口文档实现业务逻辑。
6.2. access_token管理
我们的公众号和微信服务器对接成功之后,接下来要做的就是根据我们的业务需求调用微信公众号提供的接口来实现相应的逻辑了。在使用微信公众号接口中都需要一个access_token。很复杂还未彻底理解消化。
6.3. 编写一个用于处理消息的工具类,这个类主要用于解析消息,构建消息
例如:
public class MessageUtil {
/**
* 解析微信发来的请求(XML)
* @param request
* @return map
* @throws Exception
*/
public static Map
// 将解析结果存储在HashMap中
Map
// 从request中取得输入流
InputStreaminputStream = request.getInputStream();
System.out.println("获取输入流");
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List elementList = root.elements();
// 遍历所有子节点
for (Element e :elementList) {
System.out.println(e.getName() + "|" + e.getText());
map.put(e.getName(), e.getText());
}
// 释放资源
inputStream.close();
inputStream = null;
return map;
}
/**
* 根据消息类型 构造返回消息
*/
public static String buildXml(Map map) {
String result;
String msgType = map.get("MsgType").toString();
System.out.println("MsgType:" + msgType);
if(msgType.toUpperCase().equals("TEXT")){
result = buildTextMessage(map, "Cherry的小小窝, 请问客官想要点啥?");
}else{
String fromUserName = map.get("FromUserName");
// 开发者微信号
String toUserName = map.get("ToUserName");
result = String
.format(
" " +
" %s " +
" %s " +
" %s " +
" text " +
" %s " +
" ",
fromUserName, toUserName, getUtcTime(),
"请回复如下关键词:\n文本\n图片\n语音\n视频\n音乐\n图文");
}
return result;
}
/**
* 构造文本消息
*
* @param map
* @param content
* @return
*/
private static String buildTextMessage(Map map, String content) {
//发送方帐号
String fromUserName = map.get("FromUserName");
// 开发者微信号
String toUserName = map.get("ToUserName");
/**
* 文本消息XML数据格式
*/
return String.format(
"" +
" " +
" " +
"%s " +
" " +
" " + " ",
fromUserName, toUserName, getUtcTime(), content);
}
private static String getUtcTime() {
Date dt = new Date();// 如果不需要格式,可直接用dt,dt就是当前系统时间
DateFormat df = new SimpleDateFormat("yyyyMMddhhmm");// 设置显示格式
String nowTime = df.format(dt);
long dd = (long) 0;
try {
dd = df.parse(nowTime).getTime();
} catch (Exception e) {
}
return String.valueOf(dd);
}
6.4. 在WxServlet的doPost方法中处理请求
例如:
public class WeChatAccounts extends HttpServlet {
static Logger logger = LoggerFactory.getLogger(WeChatAccounts.class);
/*
* 自定义token, 用作生成签名,从而验证安全性
* */
private final String TOKEN = "cherry";
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO 接收、处理、响应由微信服务器转发的用户发送给公众帐号的消息
// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
System.out.println("请求进入");
String result = "";
try {
Map
System.out.println("开始构造消息");
result = MessageUtil.buildXml(map);
System.out.println(result);
if(result.equals("")){
result = "未正确响应";
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("发生异常:"+ e.getMessage());
}
resp.getWriter().println(result);
}
@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("-----开始校验签名-----");
..............................
}
}
6.5. 文章资料来源
我们可以通过自己撰写文章来发表,或者从网络上引用相关的资料来发表。同时可以添加音乐、图片或者分享有益的app和技术来充实公众号。
6.6. 针对不同人群,文章进行分类
不同的人希望能看到不同的文章,我们可以把我们的文章进行分类,让读者在菜单中自主进行选择喜好的文章阅读。
7.团队管理
团队分工
负责内容 | 比例权重 | 姓名 |
---|---|---|
团队管理(Leangoo图,燃尽图) | 17% | 吴伟华 |
确定团队Alpha版本要实现的功能(WBS图,象限图,功能表),博客排版汇总 | 17% | 蔺皓雯 |
讨论制定团队的编码规范 | 14% | 杨池宇 |
讨论制定团队的编码规范 | 14% | 鲁婧楠 |
修改完善已提交的需求规格说明书,关键技术与难点 | 19% | 曾茜 |
数据库设计,项目的后端架构设计 | 19% | 蔡晨旸 |