[转载]java微信公众平台,开发源码 - wxwall - 博客园

mikel阅读(1054)

[转载]java微信平台,发源码 – wxwall – 博客园.

最近写了一个微信平台的架构,采用servlet + spring3.0 + hibernate4.1。整体架构由我负责建设,部份设计估计以后会被改的乱七八糟,所以,我尽可能的把业务模块分出来。趁着刚搭好的框架,留着这版。 以后要是被改出翔了,我也无能为力。代码是大部份都由其他成熟框架直接 copy过来整合,去掉了一些没用的配置。部分我加入的设计也都是自己经过长时间项目提炼出来的,所有代码稳定性大可放心,并且难度不大。源码我也贴网 上,希望有人帮我一起完善一下!不足处也请批评指正。

贴出部分代码,用到了部分设计模式,代码可读性比较好。没什么技术含量,里面有一些涉及微信平台的业务代码可能会有点难懂,如果您认为还不错,那就点个赞。如果认为还值得改进,那也麻烦提出来,我也近期慢慢改进。

代码贴在这里,如果有人愿意一同学习进步,后期就放到github上面去,现阶段我将持续改进。

下载地址

http://pan.baidu.com/s/1i320J3n

 

spring部分代码:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
       ">
       
       
    <!-- 扫描注解Bean -->
    <context:component-scan base-package="com.cpic">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    
    <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:resources.properties</value>
            </list>
        </property>
    </bean>

 

      <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource">
        <property name="alias" value="proxoolDataSource"/>
        <property name="driver" value="${connection.driver_class}" />
        <property name="driverUrl" value="${connection.url}" />
        <property name="user" value="${connection.username}" />
        <property name="password" value="${connection.password}" />
        <property name="maximumConnectionCount" value="${proxool.maximum.connection.count}"/>
        <property name="minimumConnectionCount" value="${proxool.minimum.connection.count}" />
        <property name="statistics" value="${proxool.statistics}" />
        <property name="simultaneousBuildThrottle" value="${proxool.simultaneous.build.throttle}"/>
    </bean>

      <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan">
            <list>
                <value>com.cpic</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.query.substitutions">${hibernate.query.substitutions}</prop>
                <prop key="hibernate.default_batch_fetch_size">${hibernate.default_batch_fetch_size}</prop>
                <prop key="hibernate.max_fetch_depth">${hibernate.max_fetch_depth}</prop>
                <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
                <prop key="hibernate.bytecode.use_reflection_optimizer">${hibernate.bytecode.use_reflection_optimizer}</prop>
                
                
                <prop key="hibernate.cache.use_second_level_cache">${hibernate.cache.use_second_level_cache}</prop>
                <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>
                <prop key="hibernate.cache.region.factory_class">${hibernate.cache.region.factory_class}</prop>
                <prop key="net.sf.ehcache.configurationResourceName">${net.sf.ehcache.configurationResourceName}</prop>
                <prop key="hibernate.cache.use_structured_entries">${hibernate.cache.use_structured_entries}</prop>
                <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
                
                <!-- 
                <prop key="hibernate.connection.datasource">${hibernate.connection.datasource}</prop>
                <prop key="hibernate.connection.provider_class">${hibernate.connection.provider_class}</prop>
                <prop key="hibernate.jndi.class">${hibernate.jndi.class}</prop>
                -->
                
            </props>
        </property>
      </bean>


    <!-- 开启AOP监听 只对当前配置文件有效 -->
    <aop:aspectj-autoproxy expose-proxy="true"/>
    
    <!-- 开启注解事务 只对当前配置文件有效 -->
      <tx:annotation-driven transaction-manager="txManager"/>

    <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="merge*" propagation="REQUIRED" />
            <tx:method name="del*" propagation="REQUIRED" />
            <tx:method name="remove*" propagation="REQUIRED" />
            <tx:method name="put*" propagation="REQUIRED" />
            <tx:method name="use*" propagation="REQUIRED"/>
            <tx:method name="send*" propagation="REQUIRED" />
            <!--hibernate4必须配置为开启事务 否则 getCurrentSession()获取不到-->
            <tx:method name="get*" propagation="REQUIRED" read-only="true" />
            <tx:method name="count*" propagation="REQUIRED" read-only="true" />
            <tx:method name="find*" propagation="REQUIRED" read-only="true" />
            <tx:method name="list*" propagation="REQUIRED" read-only="true" />
            <tx:method name="*"  read-only="true" />
        </tx:attributes>
    </tx:advice>
    <aop:config expose-proxy="true">
        <!-- 只对业务逻辑层实施事务 -->
        <aop:pointcut id="txPointcut" expression="execution(* com.cpic..service.*.*(..))" />
        <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut"/>
    </aop:config>
    
    
    <!-- spring启动时加载spring工具类  -->
    <bean id="springUtils" class="com.cpic.common.util.SpringContextUtil"></bean>
    
</beans>

部分业务 spring配置:

<bean id="textReceviService" class="com.cpic.basemsg.service.impl.TextReceviService"></bean>
    
    <bean id="eventReceviService" class="com.cpic.basemsg.service.impl.EventReceviService"></bean>
    
    <!-- 在线咨询 -->
    <bean id="onlineAskEventImpl" class="com.cpic.basemsg.service.event.impl.OnlineAskEventImpl"></bean>
    <!-- 卡单激活 -->
    <bean id="activeCareEventImpl" class="com.cpic.basemsg.service.event.impl.ActiveCareEventImpl"></bean>
    <!-- 客户回访 -->
    <bean id="custReVisEventImpl" class="com.cpic.basemsg.service.event.impl.CustReVisEventImpl"></bean>
    <!-- 道路救援 -->
    <bean id="roadHelpEventImpl" class="com.cpic.basemsg.service.event.impl.RoadHelpEventImpl"></bean>
    <!-- 自助报案 -->
    <bean id="selfPoliceEventImpl" class="com.cpic.basemsg.service.event.impl.SelfPoliceEventImpl"></bean>

    <bean id="wechatMng" class="com.cpic.basemsg.service.WeChatMng">
        <property name="map">
            <map>
                <entry key="text">
                    <ref local="textReceviService"/>
                </entry>
                <entry key="event">
                    <ref local="eventReceviService"/>
                </entry>
            </map>
        </property>
        
        <property name="baseMap">
            <map>
                <entry key="btn13">
                    <ref local="onlineAskEventImpl"/>
                </entry>
                <entry key="btn21">
                    <ref local="roadHelpEventImpl"/>
                </entry>
                <entry key="btn22">
                    <ref local="selfPoliceEventImpl"/>
                </entry>
                <entry key="btn23">
                    <ref local="custReVisEventImpl"/>
                </entry>
                <entry key="btn24">
                    <ref local="activeCareEventImpl"/>
                </entry>
            </map>
        </property>
    </bean>

业务解耦类

package com.cpic.basemsg.service;

import java.util.Map;

/**
 * 设计这个类,主要是为了解耦,可实现对逻辑层的配置,将业务更细化
 * 将一些共同特性统一处理
 * @author wuxw
 *
 */
public class WeChatMng {
    
    static Logger logger = Logger.getLogger(WeChatMng.class);
    
    @SuppressWarnings("unchecked")
    public WeChatService weChatService;
    
    @SuppressWarnings("unchecked")
    private Map<String,WeChatService> map;
    
    private Map<String,BaseEventService> baseMap;
    
    /** 点击事件*/
    public BaseEventService baseEventService;
    

    public void setMap(Map<String, WeChatService> map) {
        this.map = map;
    }


    public void setBaseMap(Map<String, BaseEventService> baseMap) {
        this.baseMap = baseMap;
    }


    /**
     * 对不同消息类型的控制转发
     * @param msgType
     * @param wxMsgXml
     * @return
     */
    public String process(String msgType,String wxMsgXml) throws BaseMsgException{
        if(msgType == null || msgType == ""){
            logger.error("请求消息:" + msgType);
            throw new BaseMsgException("请求消息为空!");
        }
        weChatService = map.get(msgType);
        if(null == weChatService){
            throw new BaseMsgException("不支持的接口类型:" + msgType);
        }
        return weChatService.process(wxMsgXml);
    }
    
    
    /**
     * 对不同事件的控制转发 
     * @parama clickKey  按钮编号
     * @return
     * @throws BaseMsgException 业务异常
     */
    public String processEvent(String click,EventMsgModel model) throws BaseMsgException{
        if(click == null){
            throw new BaseMsgException("不存在的点击事件:" + click);
        }
        if(model == null){
            throw new BaseMsgException("传入的事件消息为null!" );
        }
        baseEventService = baseMap.get(click);
        if(baseEventService == null){
            throw new BaseMsgException("暂时不支持的点击参数:" + click);
        }
        return baseEventService.process(model);
    }
    
}

部分类的核心设计

/**
 * 抽象出功能模块
 * 信息的处理流程分三步依次进行:
 *         1. 接收信息
 *         2. 处理信息
 *         3. 返回信息
 * 并且这个顺序不能变,强制使用处理信息的流程
 * 我们只需要关心业务处理的方式
 * @author wuxw
 *
 */
public abstract class WeChatServiceAbs<T extends BaseMsgModel> extends CommonHibernateDao implements WeChatService<BaseMsgModel> {
    
    /**
     * 处理消息,用模版的形式对各模块独立
     * @param xmlMsg    传入消息
     * @return            返回处理后的消息
     * @throws WeChatException
     */
    public String process(String xmlMsg) throws BaseMsgException{
        MsgModel msg = reviceMsg(xmlMsg);
        return processMsg(msg).toString();
    }
}

[猿价值] 是人是驴 算算帐看看

mikel阅读(837)

凌晨醒来给女儿倒水,然后一直睡不着,脑袋里想起一个故事:

为了驱驴前行,骑驴的主人用竹杆挑着一根胡萝卜悬挂在驴头的前面,驴为了吃到眼前的胡萝卜而努力奔走,由于驴前行时胡萝卜也在同步前行,于是这头蠢驴就永远吃不到胡萝卜,而聪明的主人却总是时不时的给块葫芦卜给驴吃,避免驴发觉真相,拒绝前行,这样就可以达到自己骑驴前行的目的。

817UCEBC_0

故事很简单,却发人深省,结合到自己的身上,感觉自己就是那头驴,只盯着每个月的死工资,想要加薪,想要提升,可到头来还是在被钱驱使下完全没有自由,注意不是老板在趋势,是钱!大家都在为钱打工,而不是真的成了人,去让钱为你打工。

你也许会说:“我有公司,我是老板,我雇人为我打工,也就是让钱在为我做事。”

那你就太低估钱了,你虽然有了公司盈利也不错,那假设有一天,你患病不能动了,你的公司没你跑业务,管理,你的公司还能运转多长时间持续盈利?如果公司会照常运转,不需要你也运营的很好,那么恭喜你,你是钱的主人了!如果没了你,公司运营不下去了,那么你还是钱的坐骑!

其实是人是驴很好判断,你自己算下账,假设自已一天也不工作,不跑业务,靠积蓄或者其他收入,你能够维持日常生活多长时间?

有人也许会问:“怎么才能做钱的主人呢?”

用最简单的一句话回答就是:“建立自己的赚钱系统!”

什么是赚钱系统?

说这个之前先讲解下 罗伯特·T·清崎 (《穷爸爸.富爸爸》的作者)提出的四象限法,

011简单概述下四象限计算方法,资产中产生的收入>负债+日常支出 那么恭喜你就是钱的主人了

具体如何建立赚钱系统,怎么翻身做钱的主人,那就是要投资,不停的投资,增加自己的资产提高资产的收入,减少自己的负债,道理很简单,做起来很难。要不断的分析尝试找到适合自己的财务自由之路。

有问题的可以加QQ 3379152 联系我

也可以关注公众号 :weikebao  威客  

qrcode_for_gh_e8f970702774_430

[转载]整理的Android开发资源

mikel阅读(1001)

[转载]整理的Android开发资源.

Android网址或Blog

身为Android开发者不知道这个网站就太说不过去了,上面有你任何你需要的东西

Android官网博客, 在上面可以关注Android最新的进展与最权威的博客(须翻墙)

我的好朋友Trinea整理的非常全面的GitHub开源项目汇总,不需要重复发明轮子,尽情遨游在开源世界里吧

国外整理的Android开源库汇总,和上面的比起来分类更明确,你总能很方便的找到你需要的开源库

每周都会有一篇技术博文,介绍新技术、新潮点,可直接邮件订阅,让你时刻紧跟潮流

专注Android UI与效果的网站(不过目前貌似已经关站了…)

也是开源代码合集,很多超赞的效果,不过是多平台的

源代码托管

身为程序员不知道GitHub的就太out了,可以让你和国际接轨的开源社区,也是目前最活跃的开源社区,免费托管公开代码,不过私有代码是收费的

如果你不想公开你的源代码,这个是首选,无限免费私有空间,不过我更喜欢开源,所以我更愿意选择GitHub

开发工具

Google帮你集成了一个完整的Android开发环境,包含一个定制的Eclipse + ADT plugin,以及最新的SDK及源码

Google最新推出的Android开发工具,个人认为也是Android开发工具的未来,但是不太稳定而且编译依赖Gradle,有一定门槛,新手们或者商业项目中不建议使用。

UI设计类

个人认为遵循Android设计原则的App才能称作是一个好App,所以在开发一个App之前请仔细阅读了解下Android的设计规范

设计界大名鼎鼎的Dribbble

比较不错的Android App设计整理

在线生成Android各种图片资源的网站,原作者是原Android Team的成员,为Android的设计做出非常大的贡献

各种扁平化设计资源,你还在为没设计资源而烦恼么?

Google

最近由于各种原因Google在国内访问不了,离开了Google搜索程序员们还怎么干活,在这里贡献两个搜索引擎,本质其实都是Google搜索

[转载]软件开发者如何准备未来?-CSDN.NET

mikel阅读(904)

[转载]软件开发者如何准备未来?-CSDN.NET.

软件开发领域有点类似股票市场。为了避免沦落到沿街乞讨,你就得预测事物的发展方向。不幸的是,就像股票市场,预测技术方向也是不可能的。 在黑莓垮台前,没人能想到它现在的下场。同样的还有Silverlight和Flash,这两种技术都意外地没落了。那么软件开发者怎样才能避免这种灾 祸,确信已经为未来做好准备了呢?

挑选一个广阔而稳固的基础方向

确保软件开发者前途光明 的最可靠办法是避免彻底偏向,应该打下一个广阔而稳固的职业基础。许多技术是时尚的,但总有一些技术更能经受时间磨砺,像C或者C++语言已经出现很久, 仍在大量使用。JavaScript是另一个具备稳固基础的伟大技术,它可以用于任何平台的编程,包括移动端、网页端,甚至嵌入式系统。你尤其需要提升通 用技术而不是特殊技术。拥有通用技巧是软件开发过程中编写良好代码的核心灵魂。

留意最新趋势

做不到准确预测未来,但可以通过一些指标看出潮流趋势,关注趋势和热议内容一直是个好主意。在Hacker News和 Pro Git等网站经常可以发现新技术的苗头。开发者大会和技术沙龙也是发现新趋势不错的渠道。

持续学习

保证不落伍最稳固的方法是学习新技术并不断扩展知识面、提升已有技术。作为软件开发者应该习惯于终身学习,做一个计划让每天或每周有一个固定的学习时间。学会如何学习,以提高学习效率并使学习变成更有趣的经历。自学是在永远变化的技术世界中存活的重要武器。

记住,世界上没有东西是凭空诞生的。新技术和新编程语言会出现,但它们都是现有某种技术或编程语言的改作或组合。你知道得越多,就越能关联新事物并使新学习部分大量减少。

愿意改变和调整

固守已知而忽略发展确实容易,但谁都不能阻止未来,我们最好放弃抗拒趋势发展,学会改变和调整。

如果始终迷信一种技术,最后伤害将多于帮助。我逐渐认识到在大风中应弯下腰——那些挺立于大地的最终会像芦苇一样被折断。

本文作者John Sonmez,Simple Programmer创始人,PluralSight作者,程序员。

原文链接: http://tinyurl.com/pro-201406-03

“猿”价值-程序员怎么体现你的价值

mikel阅读(919)

u=1087550442,4169555854&fm=21&gp=0

博客从建立到现在有7年多了,一直都是在记录转载程序开发的文章和写一些开发经验总结,随着年龄的增长,总是在探索怎么转型,将来怎么走。

其实程序员在互联网上还是应该利用自己的程序开发优势做转型,例如转型做互联网营销推广,做培训,做技术顾问

程序员的优势在于技术,往往大家都忽略这个关键因素,尽管那么多转型卖水果、卖果汁、卖烧饼都发家致富了,可多少转型失败的程序员在干啥有谁知道呢?!互联网和现实世界一样,存在大大小小的圈子,人群,程序员可能工作原因接触的都是技术圈的人,比较封闭,大家都在那拼技术意淫,可世界那么大,何不走进不同的圈子、人群逛逛,不要在苦苦挠头闷在程序bug中冰火两重天的煎熬着,头发没了,路也越走越窄了!

走出去,世界很精彩,听百家之言,取众生所长,做有意义的事,才能实现自身的价值。

[转载]搭建PHP开发环境 apache+MySQL+PHP 安装phpMyAdmin模块 - 风沙渡 - 博客园

mikel阅读(1118)

[转载]搭建PHP开发环境 apache+MySQL+PHP 安装phpMyAdmin模块 – 风沙渡 – 博客园.

该博文参考的资料来源于:

http://wenku.baidu.com/view/0e4c569ddd3383c4bb4cd267.html

http://www.cnblogs.com/pharen/archive/2012/02/06/2340628.html

http://www.admin10000.com/document/54.html

http://blog.csdn.net/zutsoft/article/details/21651041

昨天花了差不多一天的时间,跳过无数“坑”之后,把WAMP环境给搭建上了。为何说坑,是因为不理解不知道,原来最新版的apache和最新版的 php5.5存在不兼容的问题。还有Thread safe 和no thread safe版本之间的区别,PHP版本中的VC6、VC9、VC11之间的区别,现在记录一下我搭建的过程。包括各种谷歌后学习到的内容。

一、准备工作,下载软件

注:以下是我使用的版本。

apache:httpd-2.2.22-win32-x86-openssl-0.9.8t.

下载地址:http://www.apache.org/

MySQL:mySQL-installer-community-5.6.19.0.msi

下载地址:http://dev.mysql.com/downloads/windows/installer/

PHP:php-5.3.1-Win32-VC6-x86

下载地址:http://windows.php.net/downloads/releases/archives/

 

二、开始安装软件

(一)安装apache

 双击安装,与安装其他Windows软件没有什么区别,在填Server Infomation时,并没有特殊规定,只要输入的信息符合格式即可。

(注:这里选择安装类型,我一般选择Custom,这里可以自己设置安装路径,看自己喜欢)

 

安装完成之后,在浏览器输入http://localhost,如果显示It Works!,表示Apache安装成功。

 

(二)安装PHP

安装PHP:将php-5.3.1-Win32-VC9-x86.zip解压到一个目录即可。

(三)安装MySQL

插一句,昨天是因为下载错MySQL,所以搞得很头疼,建议到官网下载,我上面发的那个链接,下载的那个版本是ok的。

双击安装,如果需要更改安装目录,则在Choose Setup Type选择Custom(我比较喜欢自定义安装,建议选择自定义Custom

 


MySQL下载完成后,找到下载到本地的文件,按照下面所示的步骤双击进行安装:
步骤1:双击MySQL安装程序(mysql-installer-community-5.6.10.1)会弹出如下图1.4所示:

步骤2:单击图1.4中的“Install MySQL Products” 文字,会弹出的用户许可证协议窗口,
如下图1.5所示:

步骤3:选中“I accept the license terms” 的前面的选择框,然后点击【Next】按钮,会进入查         找最新版本界面,效果如下图1.6所示:

步骤4:单击【Execute】按钮,会进入安装类型设置界面,效果如下图1.7所示。

步骤5:选择图1.7中的“Custom”选项,可修改安装路径或保持默认值,然后单击【Next】按钮,
弹出功能选择界面,如下图1.8所示。

步骤6:单击【Next】按钮,弹出安装条件检查界面,如下图1.9所示。

步骤7:单击【Next】按钮,进行安装界面,如下图1.10所示。

步骤8:单击【Execute】按钮,开始安装程序。当安装完成之后安装向导过程中所做的设置将在安装完成        之后生效,如下图1.11所示的窗口

步骤9:单击【Next】按钮,会进入服务器配置页面,效果如下图1.12所示。

步骤10:单击【Next】按钮,效果如下图1.13所示。

图1.13中的“Server Configuration Type”下面的“Config Type”下拉列表项用来配置当着服务器的类
型。选择哪种服务器将影响到MySQL Configuration Wizard(配置向导)对内存、硬盘和过程或使用的决策,可以选择如下所示的3种服务器类型:

 Developer Machine(开发机器):该选项代表典型个人用桌面工作站。假定机器上运行着多个桌面应用程序。将MySQL服务器配置成使用最少的系统资源。
 Server Machine(服务器):该选项代表服务器,MySQL服务器可以同其它应用程序一起运行,例如FTP、email和web服务器。MySQL服务器配置成使用适当比例的系统资源。
 Dedicated MySQL Server Machine(专用MySQL服务器):该选项代表只运行MySQL服务的服务器。
假定运行没有运行其它应用程序。MySQL服务器配置成使用所有可用系统资源。
作为初学者,选择“Developer Machine”(开发者机器)已经足够了,这样占用系统的资源不会很多。

在Enable TCP/IP Networking左边的复选框中可以启用或禁用TCP/IP网络,并配置用来连接MySQL服务器的端口号,默 认情况启用TCP/IP网络,默认端口为3306。要想更改访问MySQL使用的端口,直接在文本输入框中输入新的端口号即可,但要保证新的端口号没有被 占用。

 

步骤11:单击【Next】按钮,在图1.13所对应的界面中,我们需要设置root用户的密码,在“MySQL Root
password”(输入新密码)和“Repeat Password”(确认)两个编辑框内输入期望的密码。也可以单击下面的【Add User】按钮另行添加新的用户。(注:Current Root Password:为空;如果输入密码了在后面安装会报错)


步骤12:单击【Next】按钮,设置Windows Service Name<可默认>,此名为启动数据库服务名,要记住。
效果如下图1.14所示。

 

步骤13:单击【Next】按钮,打开配置信息显示页面,如下图1.15所示。

 

步骤14:单击【Next】按钮,即可完成MySQL数据库的整个安装配置过程。接下来就可以登录上我们的MySQL数据库进行操作了。

Example:启动MySQL

可以直接使用命令行:

三、整合Apache+MySQL+PHP

(一)配置Apache

 

首先使用文本编辑工具(推荐 EditPlus )打开 E:\Program Files\Apache Software Foundation\Apache2.2\conf\httpd.conf 文件,这个文件是Apache的配置文件,下面几步都是在修改这个文件的内容。
要注意的是修改完 httpd.conf 文件需重新启动Apache服务,新设置才会生效。

 

1、让Apache加载PHP模块

找到 #LoadModule vhost_alias_module modules/mod_vhost_alias.so (大概在第128行),在这行的后面添加以下内容:

	LoadModule php5_module "E:/StuSoftware/PHP/php/php5apache2_2.dll"
	AddType application/x-httpd-php .php
	PHPIniDir "D:/WAMP/PHP"

LoadModule php5_module “E:/StuSoftware/PHP/php/php5apache2_2.dll” /*你下载的需要是VC6的版本,不然找不到这个php5apache2——2.dll文件,这是我遇到的其中一个坑,待会儿下面再说*
这句意思是以module方式载入PHP5模块。
AddType application/x-httpd-php .php
这句意思就是将.php扩展名的文件作为php脚本执行。你可以使用你喜欢的任何其他扩展名,如 .html、.php5 甚至是 .txt  来执行PHP。
PHPIniDir “D:/WAMP/PHP”
这句用来指定PHP的配置文件php.ini 所在的目录。
如果是Apache 2 以module模块方式运行php5的话,就可以使用 PHPIniDir 指令。

 

2. 修改网站存放目录

我们知道Apache默认的网站存放目录为Apache安装目录下的htdocs文件夹。当你更改网站存放目录,就必须修改相应的Apache配置。
在配置文件 httpd.conf 中查找 DocumentRoot(大概在182行),将其修改为指向网站目录的正确文件夹。我们这里改为

	DocumentRoot "F:/Workspace/PHP"

同时,查找 This should be changed to whatever you set DocumentRoot to(大概在207行),在它下面有行 <Directoy 默认的DocumentRoot >,将其修改为你自己配置的DocumentRoot 路径。我们这里修改为:

	<Directory "F:/Workspace/PHP">

我的网站存放目录是这般的:

 

 

3. 修改目录首页文件

在配置文件 httpd.conf 中查找 DirectoryIndex index.html (大概在244行)(快捷键查找按ctrl+F)将其修改成:

	DirectoryIndex index.html index.htm index.php

DirectoryIndex 指的是当客户浏览器访问的路径是一个目录时,Apache默认执行的文件。
以我们所修改的为例:当客户浏览器访问一个目录时,Apache会去找该目录下的index.html,如果没有再找index.htm,还没有再找 index.php。都找不到则默认显示该目录下的文件列表。参考文档:如果防止Apache显示文件列表

(二)配置PHP

打开PHP安装目录,即E:\StuSoftware\PHP\php,我们可以看到目录下有两个这样的文件 php.ini-development 和 php.ini-production,第一个是开发使用的配置文件,第二个是生产环境的配置,因为我们是在本机做开发,所以选择前者。将 php.ini-development复制一份到同目录下,并改名为 php.ini。这个php.ini 就是当前使用的配置文件,以下几步都是在修改这个php.ini文件的内容。要注意的是,修改php.ini文件后需重新启动Apache服务,新设置才 会生效。

1. 指定PHP扩展库的存放目录

在Windows下PHP的扩展库通常以 DLL 形式存放在PHP的ext目录中。
使用文本工具打开php.ini文件,查找extension_dir = “ext”(大概在809行),也就是在 On windows 下面那一行。把它前面的分号“;”去除掉,改为如下:

        extension_dir = "E:/StuSoftware/PHP/php/ext"

extension_dir 表示PHP扩展库的具体目录,以便调用相应的DLL文件。

2. 开启相应的扩展库

默认情况下许多PHP的扩展库都是关闭的,比如默认PHP不支持连接Mysql数据库,需开启相应的扩展库。
这里我们开启一些常用的扩展库。
查找 ; Windows Extensions(大概在941行),在它的下面是extension列表。
找到如下扩展:

        ;extension=php_curl.dll
        ;extension=php_gd2.dll
        ;extension=php_mbstring.dll
        ;extension=php_exif.dll
        ;extension=php_mysql.dll
        ;extension=php_mysqli.dll
        ;extension=php_pdo_mysql.dll
        ;extension=php_pdo_odbc.dll
        ;extension=php_sockets.dll
        ;extension=php_xmlrpc.dll
        ;extension=php_xsl.dll

把以上extension 前面的分号 “;” 去掉。如果你希望加载其它扩展模块,方法相同,只要去掉前面的分号即可。

 

提示1:重启Apache提示 “unable to load dynamic library……php_curl.dll”,加载php_curl.dll错误。解决方法是拷贝 PHP 目录下的 libeay32.dll 和 ssleay32.dll 到 windows 目录或 windows/system32 目录下,只要是系统 Path 环境变量里包含的路径就可以。如果不想拷贝,你也可以直接把 PHP 路径放到系统 Path 环境变量里。 右击我的电脑=>属性=>高级=>环境变量=>系统变量里有个Path,双击打开,把你的PHP路径加个分号“;”再前面( ;D:\WAMP\PHP ),添加进去就OK了。重启Apache不再提示该错误。
提示2:Exif 扩展是用来显示图片的 exif 信息的,因为该扩展需要 mbstring.dll 支持,所以必须将 extension=php_exif.dll 这一行写到extension=php_mbstring.dll 的后面。
提示3:如果PHP自带的扩展库不能满足你的需要,你可以去 pecl.php.net 查找并下载你需要的库。windows用户可以去 pecl4win.php.net 或者 http://downloads.php.net/pierre/ 下载已经编译好的DLL文件,也可以去http://museum.php.net/php5/ 载PECL集合压缩包。
提示4:很多人在找php_zip.dll,其实从php5.3开始已经集成了zip扩展,直接使用就行了。你可以用<?php phpinfo()  ?> 找到zip扩展的说明。

目前针对不同用户,MySQL提供了2个不同的版本:  MySQL Community Server:社区版,该版本完全免费,但是官方不提供技术支持。 
 
MySQL Enterprise Server:企业版,它能够高性价比的为企业提供数据仓库应用,支持ACID事物处理,提供完整的提交、回滚、崩溃恢复和行级锁定功能。但是该版本需付费使用,官方提供电话及文档等技术支持。 
目前最新的MySQL版本为MySQL 5.6,可以在官方网站http://dev.mysql.com/downloads/下载该软
件。 下图1.2所示的MySQL官网上单击图片上的“Download”超链接 或 点击左边标记处,然后按照提示一步步操作就可以将MySQL软件下载到本 地计算机中了。注意这里我们选择的是数据库版本是“Windows (x86, 32-bit), MSI Installer”,如下图1.3所示。

3. 让PHP支持短标签

在 php.ini 配置文件查找 short_open_tag = Off (大概在266行)把它修改成:short_open_tag = On 让其支持短标签。
php的代码一般包含在<?php …. ?>的标签内,设置 short_open_tag = On 之后,可以写成更简洁的形式:<? …. ?>。

4. 配置PHP的Session功能

在使用session功能时,我们必须配置session文件在服务器上的保存目录。我们需要为session建立一个可读写的目录,这个目录最好独立于网站目录之外。
这里把目录上建在了D:\WAMP\sessiontmp,然后在 php.ini 配置文件中找 ;session.save_path = “/tmp” (大概在1467行),去掉前面的分号“;” ,改为如下:

        session.save_path = "D:/WAMP/sessiontmp"

5. 配置PHP的文件上传功能

同session一样,在使用PHP文件上传功能时,我们必须要指定一个临时文件夹以完成文件上传功能,否则文件上传功能会失败。
我们建立一个可读写的目录文件夹 D:\WAMP\fileuploadtmp,然后在 php.ini 配置文件中找到 ;upload_tmp_dir = (大概875行),修改为:

        upload_tmp_dir = "D:/WAMP/fileuploadtmp"

PHP默认上传文件大小不超过2M,要想上传大于2M的文件,请参考文档  配置php.ini实现文件上传功能

6. 设置时区

在 php.ini 配置文件查找 ;date.timezone = (大概在993行),去掉前面的分号“;” 改为如下:

	date.timezone = PRC

date.timezone是PHP5.1开始新增加的配置参数,用来设置时区。默认date.timezone是被注释掉的,也就是默认时区是UTC格林威治标准时间。
我们这里改为 date.timezone = PRC(PRC,People’s Republic of China,中华人民共和国),也就是日期使用中国的时区。这样可以解决时间相差八小时的问题。

 

(三)配置phpMyAdmin

直接在最开头给出的官网链接下载最新版的phpMyAdmin。

首先解压,然后将文件拷贝到网站根目录下,我的是F:\Workspace\PHP\phpMyAdmin

然后到浏览器访问http://localhost/phpMyAdmin/index.php

如图:

 

 

之前说的php的版本VC6/9/11的区别,以及Threadsafe和no Threadsafe的区别:

VC6版本是使用Visual Studio 6编译器编译的,如果你的PHP是用Apache来架设的,那你就选择VC6版本。(现在PHP已经没有VC6了)。

VC9意思就是该版本PHP是用VisualStudio2008编译的,而VC11则是用VisualStudio2012编译的。这意味着

如果你下载的是VC9版本的,就需要先安VisualC++RedistributableforVisualStudio2008SP1,

如果你下载的是VC11版本的,就需要先安VisualC++RedistributableforVisualStudio2012.

搭建php首先看操作系统的版本,如果是Windows的在这里下:http://windows.php.net/download/

操作系统是32位还是64位?如果是32位的,就选择带“x86”的版本,如果是64位的,就选择带“x64”的版本。然后看WEB服务器是什么?如果是IIS系列,就选择带“Non Thread Safe”的版本,如果是Apache httpd系列,就选择带“Thread Safe”的版本。 如果是Apache httpd还要看这个二进制版本是怎么编译的,有三种编译类型,分别是:VC6、VC9、VC11(分别代表Visual C++ 6、Visual C++ 2008、Visual C++ 2012)。这里就有麻烦了:PHP官方的最新版本5.5已经用VC11编译,5.4是用VC9编译的。可是Apache httpd的最新版本呢,至今还是用VC6编译。这意味着一个惊人的事实:Apache httpd的官方版本和PHP的官方版本竟然是无法兼容的!

 到这里,全部安装都完毕,WAMP平稳运行。

[转载]ecShop农行支付接口 | PHPSIR.COM 技术博客

mikel阅读(981)

[转载]农行 | PHPSIR.COM 技术博客.

function respond()
{
$result = false;

$originData = $_POST["MSG"];
$xmlData = base64_decode($originData);
$retCodStartStr = "<ReturnCode>";
$retCodEndStr = "</ReturnCode>";
$retCodStartPos = strpos($xmlData,$retCodStartStr);
$retCodEndPos = strpos($xmlData,$retCodEndStr);
$retCode = substr($xmlData,$retCodStartPos+strlen("<ReturnCode>"),$retCodEndPos-$retCodStartPos-strlen("<ReturnCode>"));//注意不可使用$ReturnCode,否则会什么都不显示,可能是保留字

$errMesStartStr = "<ErrorMessage>";
$errMesEndStr = "</ErrorMessage>";
$errMesStartPos = strpos($xmlData,$errMesStartStr);
$errMesEndPos = strpos($xmlData,$errMesEndStr);
$ErrorMessage = substr($xmlData,$errMesStartPos+strlen("<ErrorMessage>"),$errMesEndPos-$errMesStartPos-strlen("<ErrorMessage>"));

$sigStartStr = "<Signature>";
$sigEndStr = "</Signature>";
$sigStartPos = strpos($xmlData,$sigStartStr);
$sigEndPos = strpos($xmlData,$sigEndStr);
$signature = substr($xmlData,$sigStartPos+strlen("<Signature>"),$sigEndPos-$sigStartPos-strlen("<Signature>"));

$mesStartStr = "<Message>";
$mesEndStr = "</Message>";
$mesStartPos = strpos($xmlData,$mesStartStr);
$mesEndPos = strpos($xmlData,$mesEndStr);
$message = substr($xmlData,$mesStartPos+strlen("<Message>"),$mesEndPos-$mesStartPos-strlen("<Message>"));
//验证签名有效性
$data = $message;
$fp = fopen(ROOT_PATH."MainServer.0001.pem", "r");
$pub_key = fread($fp, 8192);

$pubkeyid = openssl_get_publickey($pub_key);
$sig=base64_decode($signature);
if(openssl_verify($data,$sig,$pubkeyid)==1)
{
if($retCode=="0000")
{
//订单号
$OrderNoStartStr = "<OrderNo>";
$OrderNoEndStr = "</OrderNo>";
$OrderNoStartPos = strpos($xmlData,$OrderNoStartStr);
$OrderNoEndPos = strpos($xmlData,$OrderNoEndStr);
$OrderNo = substr($xmlData,$OrderNoStartPos+strlen("<OrderNo>"),$OrderNoEndPos-$OrderNoStartPos-strlen("<OrderNo>"));

//订单金额
$AmountStartStr = "<Amount>";
$AmountEndStr = "</Amount>";
$AmountStartPos = strpos($xmlData,$AmountStartStr);
$AmountEndPos = strpos($xmlData,$AmountEndStr);
$Amount = substr($xmlData,$AmountStartPos+strlen("<Amount>"),$AmountEndPos-$AmountStartPos-strlen("<Amount>"));

//批次号
$BatchNoStartStr = "<BatchNo>";
$BatchNoEndStr = "</BatchNo>";
$BatchNoStartPos = strpos($xmlData,$BatchNoStartStr);
$BatchNoEndPos = strpos($xmlData,$BatchNoEndStr);
$BatchNo = substr($xmlData,$BatchNoStartPos+strlen("<BatchNo>"),$BatchNoEndPos-$BatchNoStartPos-strlen("<BatchNo>"));

//传票号
$VoucherNoStartStr = "<VoucherNo>";
$VoucherNoEndStr = "</VoucherNo>";
$VoucherNoStartPos = strpos($xmlData,$VoucherNoStartStr);
$VoucherNoEndPos = strpos($xmlData,$VoucherNoEndStr);
$VoucherNo = substr($xmlData,$VoucherNoStartPos+strlen("<VoucherNo>"),$VoucherNoEndPos-$VoucherNoStartPos-strlen("<VoucherNo>"));

//会计日期
$HostDateStartStr = "<HostDate>";
$HostDateEndStr = "</HostDate>";
$HostDateStartPos = strpos($xmlData,$HostDateStartStr);
$HostDateEndPos = strpos($xmlData,$HostDateEndStr);
$HostDate = substr($xmlData,$HostDateStartPos+strlen("<HostDate>"),$HostDateEndPos-$HostDateStartPos-strlen("<HostDate>"));

//会计时间
$HostTimeStartStr = "<HostTime>";
$HostTimeEndStr = "</HostTime>";
$HostTimeStartPos = strpos($xmlData,$HostTimeStartStr);
$HostTimeEndPos = strpos($xmlData,$HostTimeEndStr);
$HostTime = substr($xmlData,$HostTimeStartPos+strlen("<HostTime>"),$HostTimeEndPos-$HostTimeStartPos-strlen("<HostTime>"));

//备注
$MerchantRemarksStartStr = "<MerchantRemarks>";
$MerchantRemarksEndStr = "</MerchantRemarks>";
$MerchantRemarksStartPos = strpos($xmlData,$MerchantRemarksStartStr);
$MerchantRemarksEndPos = strpos($xmlData,$MerchantRemarksEndStr);
$MerchantRemarks = substr($xmlData,$MerchantRemarksStartPos+strlen("<MerchantRemarks>"),$MerchantRemarksEndPos-$MerchantRemarksStartPos-strlen("<MerchantRemarks>"));

//支付方式
$PayTypeStartStr = "<PayType>";
$PayTypeEndStr = "</PayType>";
$PayTypeStartPos = strpos($xmlData,$PayTypeStartStr);
$PayTypeEndPos = strpos($xmlData,$PayTypeEndStr);
$PayType = substr($xmlData,$PayTypeStartPos+strlen("<PayType>"),$PayTypeEndPos-$PayTypeStartPos-strlen("<PayType>"));

//通知方式
$NotifyTypeStartStr = "<NotifyType>";
$NotifyTypeEndStr = "</NotifyType>";
$NotifyTypeStartPos = strpos($xmlData,$NotifyTypeStartStr);
$NotifyTypeEndPos = strpos($xmlData,$NotifyTypeEndStr);
$NotifyType = substr($xmlData,$NotifyTypeStartPos+strlen("<NotifyType>"),$NotifyTypeEndPos-$NotifyTypeStartPos-strlen("<NotifyType>"));

//todo:商户更新相关数据库操作

$order_sn = $OrderNo;
if(substr($order_sn,0,4)=="0000"){
$order_id = get_order_id_by_sn($order_sn,true);
order_paid($order_id);
}
else{
$order_id = get_order_id_by_sn($order_sn);
order_paid($order_id);
}
$result = true;
file_put_contents("abcbank.txt","支付成功1",FILE_APPEND);
}
else
{
file_put_contents("abcbank.txt","错误码:".$retCode."错误信息:".$ErrorMessage,FILE_APPEND);
}
}
else
{
file_put_contents("abcbank.txt","签名验证失败,该通知内容不可信",FILE_APPEND);
}

// free the key from memory
openssl_free_key($pubkeyid);
return $result;

}

[转载]对于php实现soap代理的一个常见问题:Class 'SoapClient' not found in PHP的处理方法_gayayang_百度空间

mikel阅读(874)

[转载]对于php实现soap代理的一个常见问题:Class ‘SoapClient’ not found in PHP的处理方法_gayayang_百度空间.

首先确定,这是因为你的电脑的php.ini配置文件中的extension=php_soap.dll这个项没有或者没打开(没打开的意思是他的前面有个“;”)。这点请不用质疑。然后,你写个php文件,里面什么都不用写,就写一句“phpinfo();”即可。

如:

de9003f5b1cd7e574e4aeaaf
然后去浏览器打开这个页面。看里面的一个Loaded Configuration File的值是什么。如:

bfc3efd1d456d866485403b2
然 后在电脑中找到对应的该文件,打开,在里面找到一大堆extension=…的,看里面有没有:extension=php_soap.dll,有就 将其前面的“;”去掉,没有就加上这句即可。如果必要的话,还可以将以下这个也配置好:extension=php_openssl.dll。特别注意: 这里不是apache整套安装包里面的:

7d68c2836b962a67b21bbab5

不要在这几个文件里面改,虽然里面都有那个项。但改了根本没用。

然后保存。重启apache。再次去打开你要打开的soap代理页面。就可以了。测试soap是否可以的测试文件这里附上代码:

<!--?php //echo phpinfo();  $client = new SoapClient("http://www.webservicex.net/globalweather.asmx?WSDL");         $param=array("CountryName"=-->'China');
$out=$client-&gt;GetCitiesByCountry($param);
$data=$out-&gt;GetCitiesByCountryResult;
print_r($data);

$param=array("CityName"=&gt;'Beijing',"CountryName"=&gt;'China');
$out1 = $client-&gt;GetWeather($param);
$data1 = $out1-&gt;GetWeatherResult;
print_r($data1);

?&gt;

[转载]easyui 布局自适应 - 五行缺酒 - 博客园

mikel阅读(1221)

[转载]easyui 布局自适应 – 五行缺酒 – 博客园.

最近在把以前写的一个项目改成用easyui做前端。过程中遇到了不少问题。其中一个就是datagrid不能很好的布局。想了好多办法都有局限。最后想到会不会是布局(easyui-layout)的问题,经过实验,最后问题解。

 

1:比如在项目中用到了datagrid。如果界面比较简单---只有一个datagrid只需要把它的属性fit 设置为true就能实现自动适应窗体。如果在datagrid上方还有其他div的话,div 就会把datagrid挤压到窗体的下方。如果datagrid有分页控件,分页控件就看不到了。这个时候就应该用 easyui-layout来分隔窗体来使具体的内容放在easyui-layout不同的部分。这样就能很好的解决自适应问题。
糟糕的写法:
<div>查询条件</div>
  <table class="easyui-datagrid" fit="true"></table>

正确的写法:

<div class="easyui-layout" data-options="fit:true">
<div style="height: 100px;" data-options="region:'north'">
<div>查询条件</div>
</div>
<div data-options="region:'center'"></div>
</div>
2:基于body标签的easyui-layout当浏览器窗口大小改变时,easyui-layout可以根据窗口的大小来调整自己的大小.基于div标签的easyui-layout如果想拥有上述功能必须设置easyui-layout的属性fit等于true.
情形1:

        <body class="easyui-layout">
            <div data-options="region:'north'" style="height:100px">
                <table id="part1"></table>
            </div>
            <div data-options="region:'center'">
                <table id="part2"></table>
            </div>
        </div>

情形2:


        <div class="easyui-layout"data-options="fit:true">
            <div data-options="region:'north'" style="height:100px">
                <table id="part1"></table>
            </div>
            <div data-options="region:'center'">
                <table id="part2"></table>
            </div>
        </div>

3:在html中定义easyui时,下面两种写法是一样的。即easyui控件的属性可以写在dataoptions属性里,也可以把这些属性写到标签上。

写法1:


        <div class="easyui-layout"data-options="fit:true">
            <div data-options="region:'north'" style="height:100px">
                <table id="part1"></table>
            </div>
            <div data-options="region:'center'">
                <table id="part2"></table>
            </div>
        </div>

写法2:

<div class="easyui-layout"fit="true">
  <div region="north"style="height:100px;">
    <table id="part1"></table>
  </div>
  <div region="center">
            <table id="part2"></table>
  </div>
</div>

[转载]Sencha Touch+PhoneGap打造超级奶爸之喂养记(一) 源码免费提供 - liongis - 博客园

mikel阅读(1140)

[转载]Sencha Touch+PhoneGap打造超级奶爸之喂养记(一) 源码免费提供 – liongis – 博客园.

起源

  非常高兴我的宝宝健康平安的出生了。对于初次做奶爸的我,喜悦过后,面临着各 中担心,担心宝宝各项指标是否正常。最初几天都是在医院待着,从出生那一天开始,护士妹妹隔一段时间就会来问宝宝的喂奶,大小便,体温等情况。我想医生们 应该也是通过这些数据来分析宝宝是否健康。宝宝刚才出生的几天,吃喝,大小便很频繁,但又不方便记录,很容易遗漏,所以想做一个APP来记录宝宝的一些数 据。最近正在学习Sencha Touch+PhoneGap,经过几天的开发,基本成型,目前我的宝宝一些数据都是用这个软件来记录的。同时也分享给大家,希望能对更多的人有用。初次 开发,还有很多不周全的地方,望各们指正。

  宝宝刚出生这一段时间主要需要记录的数据有:妈妈喂奶次数,喝牛奶多少量,大小便多少次,体温多少,睡了多长时间。APP也是围绕这几个功能进行开发。

最终效果

首页

母乳

奶瓶

尿布

体温

新增睡觉记录

 

技术点

1.使用Sencha Touch+PhoneGap开发移动端应用,结构比较完整,且功能不复杂,适合初学者学习。

2.使用SQLite做为数据存储,实现真机和PC浏览器两种模式对数据库操作。可以在PC上用浏览器上运行,方便对程序进行调试。

3.扩展时间选择控件,可以同时对日期,时间进行选择。

4.对日期选择控件进行汉化处理。

 

程序结构

本着学习和分享的精神,记录我整个程序的架构和开发过程,以方便初学者可以更快速的入门。

Sencha Touch使用的是MVC模式,有些内容是固定的,网上有很多入门文章,都是需要先装一堆东西。我用的方法很简单,直接新建目录,把需要的资源包拷贝到指定的目录。

整个程序目录结构如下:

sencha touch 2.3.1,phonegap 2.0.0

因为此程序可以在PC端支持HTML5的浏览器下运行,所以我们先讲sencha touch的开发,以后再说使用phonegap打包成手机端应用。

 

相关代码

index.html



喂养记录

<script src="cordova-2.0.0.js" charset="utf-8"></script><script src="lib/st2.3.1/sencha-touch-debug.js"></script>
<script src="app.js"></script><script src="plugin/pgsqliteplugin.js" charset="utf-8"></script>
<script src="plugin/sqlitedb.js" charset="utf-8"></script><script src="utils/dbhelper.js" charset="utf-8"></script>
<script src="utils/utils.js" charset="utf-8"></script>

&nbsp;

app.js

//数据库文件
var localFileName = "superdad.db",fgDB;
var weinaiStore, muruStore, niaobuStore, tiwenStore, shuijiaoStore;

function onBodyLoad() {
// 注册回退按钮事件监听器
document.addEventListener("backbutton", onBackKeyDown, false); // 返回键

if (Ext.os.is.Windows) {
//alert("windows");
fgDB = new sqliteDB(localFileName, 1024*1024*2);
if(0) {
initFGdb();
}
} else {
document.addEventListener("deviceready", initSystem, true);
}
}

function initFGdb() {
fgDB.transaction(function(tx) {
tx.executeSql('DROP TABLE IF EXISTS weiyang');
tx.executeSql('CREATE TABLE IF NOT EXISTS [weiyang] (' +
'[id] INTEGER PRIMARY KEY AUTOINCREMENT, ' +
'[itemhash] VARCHAR2(16), ' +
'[stype] VARCHAR2(2), ' +
'[date] VARCHAR2(20), ' +
'[volume] VARCHAR2(4), ' +
'[remark] VARCHAR2(200), ' +
'[dateCreated] DATETIME)'
);
}, function(){
//alert('初始化表成功');
}, function (er) {
console.log('error with executeSql', er);
});
}

function initSystem() {
//compass = new Compass();
//compass.startWatch();
//alert("罗盘成功!");
window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) {
fileSystem = fs;
// isFirstLoad = false;
if (fileSystem != null) {
// alert(fileSystem.root.fullPath);
var mapFile = fileSystem.root.getDirectory("superdad/", {
create : true,
exclusive : false
}, function(parent) {
//打开数据库
openMBdb(parent.fullPath);
// alert(mapPath);
}, function(msg) {
// alert(msg);
});
} else {
alert("数据库打开失败!");
}
}, function() {
alert("数据库打开失败!");
});
}
// enable Ext autoloader
Ext.Loader.setConfig({
enabled : true
});

function openMBdb(path) {
var options = {};
options.storage = "external";
options.path = path;
fgDB = new PGSQLitePlugin(localFileName, function(dbResult, dbObject){
console.log("Database status=" + dbResult.status);
console.log("Database version=" + dbResult.version);
//fgdb = dbObject;
//alert("数据库打开成功");
if(dbResult.isNew) {
initFGdb();
}
}, function(err){
console.log("Error create database::err=" + err);
alert("数据库打开失败" + err);
},options);
}

function onConfirm(button) {
// alert('You selected button ' + button);
if (button == 1)
navigator.app.exitApp(); // 选择了确定才执行退出
}
// Show a custom confirmation dialog
//
function onBackKeyDown() {
navigator.notification.confirm('按确定退出程序!', // message
onConfirm, // callback to invoke with index of button pressed
'确定要退出程序吗?', // title
'确定,取消' // buttonLabels
);
}

//
Ext.Loader.setPath({
'Ext.ux' : 'ux',
'Ext' : 'lib/st2.3.1/src',
'WeiYang' : 'app'
});
//
Ext.application({
name : 'WeiYang', //程序名称
requires : ['Ext.MessageBox'], //引用的资源
models : ['WeiYangInfo'], //数据模型
stores : ['WeiYangStore'], //数据源
views : ['Main','Login'], //视图
controllers : ['MainController'], //控制器,
launch : function() {
// Destroy the #appLoadingIndicator element
// Ext.fly('appLoadingIndicator').destroy();
//Ext.Viewport.add(Ext.create('WeiYang.view.Login'));
Ext.Viewport.add(Ext.create('WeiYang.view.Main'));

weinaiStore = Ext.create('WeiYang.store.WeiYangStore');
muruStore = Ext.create('WeiYang.store.WeiYangStore');
niaobuStore = Ext.create('WeiYang.store.WeiYangStore');
tiwenStore = Ext.create('WeiYang.store.WeiYangStore');
shuijiaoStore = Ext.create('WeiYang.store.WeiYangStore');

Ext.Date.monthNames = [
'一月', '二月', '三月', '四月', '五月', '六月',
'七月', '八月', '九月', '十月', '十一月', '十二月'
];

Ext.Date.dayNames=["星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"];
},
// html5缓存更新
onUpdated : function() {
Ext.Msg.confirm("更新", "系统已经自动更新到最新版本,是否重新加载?", function(
buttonId) {
if (buttonId === 'yes') {
window.location.reload();
}
});
}
});

今天先写到这里,宝宝醒了,得去冲牛奶了,下回继续说。
源代码免费提供

需要源码的朋友可以留下邮箱,我统一发送。

也可以先下载APK试试

超级奶爸之喂养记APK点击下载