您的位置:首页 > 其它

项目开发记事

2015-09-01 09:23 323 查看
第一步

1.需求分析---讨论沟通,分析了解ideashow使用客户的想法及及需求,相关设计理念风格等

2.根据了解的情况进行平面设计和相关数据库设计,详细每个页面的主功能,

3.在平面设计的基础上进行网页html写入,写出对应的静态页面

第二步

分析项目

考虑用spring+hibernate+struts框架+mysql数据库操作

1.整合ssh

SSH的整合分为两步:

1)将 Hibernate 整合到 Spring 中.

将SessionFactory作为Bean配置在Spring容器中.spring容器要求项目启动就初始化,通过使用 ServletContextListener 接口,监听application作用域(项目本身)的初始化事件,以Eager的方式第一时间实例化容器;将容器存入 application作用域,供其他组件使用,默认实现单例模式我采用在web.xml中初始化spring容器.

spring applicationContext.xml的配置:

dataSource数据源

sessionFactory

事务管理器TM

声明式事务是如何进行的tx:advice

aop配置

2)将 Struts2 和 Spring 整合。

Struts2管理Action类, Spring管理业务组件,业务组件依赖注入到Action类。

2.微信端

确定了整体使用框架后.分析ideashow用户是从微信接口过来的,然后去了解微信接口:

用户通过服务号的自定义菜单中子菜单click,view事件访问网站.通过阅读微信api,了解需要获取用户涉及到oauth2网络协议,绑定服务号实现相关接口对接.

开始开发

1.理清相关数据库表结构,对应关系,表关联确定user,idea两张表为主表

建对应实体类,通过注解配置hibernate映射关系

2.结合mvc思想,分层处理,逻辑,视图,DB访问,业务,附日志,相关工具类,配置文件,jar包,还有单元测试.

细节:

(使用ssh框架时最好每次访问jsp视图时先访问action资源,通过struts.xml访问jsp,可以先行对页面数据进行预处理)

1.数据删除不是物理删除,一般是通过ajax处理,在逻辑层设置某一字段为某值,在查询是排除这一字段的值范围

2.一般页面都是预加载,减轻服务器压力,当有用户操作时再根据情况处理,比如加载列表时一般是显示满页面下拉加载更多

3.下拉加载时采用append拼接时应注意:因为是后加载的不是页面加载完毕后有的对象,所以jquery对象取不到,判断也应该用js写.

4.文本框验证:非空,去空格非空,换行,关键字,html网页标签.. disabled避免用户多次提交

5.一般共有的逻辑会抽出共同函数,封装写方法,通过调用利于后期维护和代码整洁

6.一般常量封装到一个类中,通过调用可以方便使用,便于以后修改。

7.微信公众平台开发中access_token的有效期是7200秒(两小时),需要保证不过期,ideashow中采用的是启动一个线程,在线程的run()方法中写一个死循环,然后使用Thread.sleep()来保证线程到7000s时刷新执行某项任务

8.json中含有双引号分号回车换行等不能正常解析

9.用户点赞后台需要进行判断是否已点过。同时对相关的积分做处理

10做分享接口时出现的问题:

1)由于jsapi_ticket的有效期是7200秒(两小时),在有效期内,可以一直使用,只有当jsapi_ticket过期时,才需要再次调用接口获取jsapi_ticket,本项目是保存到内存中。

2)只做了分享到朋友圈,用户点分享到朋友报错,考虑不周全,没有作为用户去体验

3)分享出去的应该是动态的,实时的,更能吸引人。

11.文件上传

1)上传文件应该放在web-inf-目录上

2)防止文件覆盖,产生唯一文件名

3)为防止一个目录下太多文件,使用hash算法打散

4)限制文件上传大小的最大值

5)限制文件上传类型,判断后缀是否合法

11.微信获取用户昵称中含有表情符号会出现乱码,报错

数据在 Mysql 5.5 之前,UTF-8 支持1-3个字节的编码,从 Mysql5.5 开始后,可以支持4个字节的 UTF 编码,但要特殊标记。修改 Mysql 相应存储字段为 utf8mb4 。修改语句如下:

ALTER TABLE table_name

MODIFY COLUMN content varchar(500) CHARACTER

SET utf8mb4 COLLATE utf8mb4_unicode_ci

DEFAULT NULL COMMENT 'content of message';

12.alert(location.href.split('#')[0])显示页面完整url

13. MySQL数据库连接超时(wait_timeout)问题的处理

错误原因:org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.JDBCConnectionException

由于MySQL服务在长时间不连接之后断开了,断开之后的首次请求会抛出这个异常,打开MySQL的控制台,运行:show variables like ‘%timeout%’,查看和连接时间有关的MySQL系统变量,

MySQL的系统变量由配置文件控制,当配置文件中不配置时,系统使用默认值,这个28800就是wait_timeout的默认值

14.在一般系统中药对session的有效期进行处理,默认是180分钟。session的过期时间计算是从当前session的最后一次请求开始

session失效后需要用到监听器,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序,就可以了。

监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法

微信公众平台开发记事

接入测试

(get请求接入)

发送消息 转发(参数signature、timestamp、nonce、echostr) (将token + timestamp + nonce 按字典序排序,拼接成字符串进行SHA-1加密)

微信客户端------------------------------------->微信服务器---------------------------------------------------------------->公网服务器(servlet)

微信加密签名、时间戳、随机数、随机字符串 (url)

返回加密后新字符串 (与signature 比较,相同返回 echostr)

微信服务器 <--------------------------------------------------------------

(返回的echostr 与发过去的echostr比较

相同表示接入成功,不同就失败)

点击开发者中心,首先启用服务器配置。填写url和token(和java代码中的一样)、EncodingAESKey是随机生成,消息加解密方式选择明文模式。

这里的url就是在服务器中中创建应用的地址,我们已经将写好的java代码上传到这个地址。token是微信服务器和自身服务器进行对接验证是用到的(必须保持一致),消息

加密暂时选择明文模式,如果选择加密模式需要编写加密代码,以后会再转到加密或兼容模式,这里先用明文模式(服务器要打开),

如果现实成功就说明接入完成。

微信服务器与我们的服务器之间是通过xml传递数据的,需要实现消息实体与xml之间的互换

当用户发消息给公众账号时,微信公众平台服务器会使用http请求对接入的网址进行消息推送,第三方服务器可通过响应包回复特定结构,从而达到回复消息的目的。

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------



微信消息运行流程:

通过dom4j.jar解析xml,将名称和值封装到map集合中,从集合中获取消息参数,封装到响应消息中---------根据消息类型判断,对不同的消息请求回复不同的内容------将响应消息对象转XML返回给微信服务器

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

图文消息使用总结

1)一定要给图文消息的Url属性赋值。不管是单图文,还是多图文,或者是不含图片的图文,都有可能会被用户点击。如果Url为空,用户点击后将会打开一个空白页面,这给用户的体验是非常差的;

2)只有单图文的描述才会显示,多图文的描述不会被显示;

3)图文消息的标题、描述中可以使用QQ表情和符号表情。合理地运用表情符号,会使得消息更加生动;

4)图文消息的标题、描述中可以使用换行符。合理地使用换行符,会使得内容结构更加清晰;

5)图文消息的标题、描述中不支持超文本链接(html的<a>标签)。不只是技术上实现不了,就连逻辑上也说不通,因为一条图文消息的任何位置被点击,都将调用微信内置的浏览器打开Url,如果标题、描述里再放几个超链接,不知道点击该打开哪个页面。

6)图文消息的链接、图片链接可以使用外部域名下的资源,如本例中:柳峰的头像、博文的链接,都是指向CSDN网站的资源。

7)使用指定大小的图片。第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80。如果使用的图片太大,加载慢,而且耗流量;如果使用的图片太小,显示后会被拉伸,失真了很难看。

8)每条图文消息的图文建议控制在1-4条。这样在绝大多数终端上一屏能够显示完,用户扫一眼就能大概了解消息的主要内容,这样最有可能促使用户去点击并阅读。

自定义菜单的创建步骤

1、找到AppId和AppSecret。自定义菜单申请成功后,在“高级功能”-“开发模式”-“接口配置信息”的最后两项就是;

2、根据AppId和AppSecret,以https get方式获取访问特殊接口所必须的凭证access_token;

3、根据access_token,将json格式的菜单数据通过https post方式提交。 封装一个通用的请求方法httpRequest(url,method,data)

1)自定义菜单是一个3x5结构的,即菜单最多只能有二级,一级菜单最多只能有3个,每个一级菜单下最多可以有5个二级菜单项;

2)菜单项都有一个key值。当用户点击某个菜单项时,微信会将该菜单项的key值以事件推送的方式发送给我们的后台处理程序。

事件推送:

目前只开启自定义菜单接口事件推送

当MegType = event 就表示这是一条事件推送消息;而Event表示事件类型包括订阅(subscribe)、取消订阅(unsubscribe)和自定义菜单点击事件(CLICK) 、(VIEW)访问网页

网页授权流程:

1、引导用户进入授权页面同意授权,获取code

2、通过code换取网页授权access_token(与基础支持中的access_token不同)

3、如果需要,开发者可以刷新网页授权access_token,避免过期

4、通过网页授权access_token和openid获取用户基本信息(支持UnionID机制)

"|<[^>]+>(.*)</[^>]+>|U" 此正则用于将一对对 html 标签挑出来 <[^>]+> 匹配标签开始 </[^>]+> 匹配标签结束 最后面的 |U 表示只匹配最近的一个字符串;不重复匹配;

a.*?b 惰性匹配 a.*b 贪婪匹配
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: