Sencha Touch+PhoneGap打造超级奶爸之喂养记(一) 源码免费提供

起源

  非常高兴我的宝宝健康平安的出生了。对于初次做奶爸的我,喜悦过后,面临着各中担心,担心宝宝各项指标是否正常。最初几天都是在医院待着,从出生那一天开始,护士妹妹隔一段时间就会来问宝宝的喂奶,大小便,体温等情况。我想医生们应该也是通过这些数据来分析宝宝是否健康。宝宝刚才出生的几天,吃喝,大小便很频繁,但又不方便记录,很容易遗漏,所以想做一个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

 1 <!DOCTYPE html>
 2 <html>
 3 <head>
 4     <title>喂养记录</title>
 5     <meta http-equiv=Content-Type content="text/html;charset=utf-8">
 6
 7     <script type="text/javascript" charset="utf-8" src="cordova-2.0.0.js"></script>
 8
 9     <link href="lib/st2.3.1/resources/css/sencha-touch.css" rel="stylesheet" type="text/css" />
10     <link href="resources/css/app.css" rel="stylesheet" type="text/css" />
11     <link href="resources/css/main.css" rel="stylesheet" type="text/css" />
12     <script src="lib/st2.3.1/sencha-touch-debug.js" type="text/javascript"></script>
13     <script src="app.js" type="text/javascript"></script>
14
15     <script type="text/javascript" charset="utf-8" src="plugin/pgsqliteplugin.js"></script>
16     <script type="text/javascript" charset="utf-8" src="plugin/sqlitedb.js"></script>
17
18     <script type="text/javascript" charset="utf-8" src="utils/dbhelper.js"></script>
19     <script type="text/javascript" charset="utf-8" src="utils/utils.js"></script>
20
21 </head>
22 <body onload="onBodyLoad()">
23
24 </body>
25 </html>

app.js

  1 //数据库文件
  2 var localFileName = "superdad.db",fgDB;
  3 var weinaiStore, muruStore, niaobuStore, tiwenStore, shuijiaoStore;
  4
  5 function onBodyLoad() {
  6     // 注册回退按钮事件监听器
  7     document.addEventListener("backbutton", onBackKeyDown, false); // 返回键
  8
  9     if (Ext.os.is.Windows) {
 10         //alert("windows");
 11         fgDB = new sqliteDB(localFileName, 1024*1024*2);
 12         if(0) {
 13             initFGdb();
 14         }
 15     } else {
 16         document.addEventListener("deviceready", initSystem, true);
 17     }
 18 }
 19
 20 function initFGdb() {
 21     fgDB.transaction(function(tx) {
 22         tx.executeSql(‘DROP TABLE IF EXISTS weiyang‘);
 23         tx.executeSql(‘CREATE TABLE IF NOT EXISTS [weiyang] (‘ +
 24                 ‘[id] INTEGER PRIMARY KEY AUTOINCREMENT, ‘ +
 25                 ‘[itemhash] VARCHAR2(16), ‘ +
 26                 ‘[stype] VARCHAR2(2), ‘ +
 27                 ‘[date] VARCHAR2(20), ‘ +
 28                 ‘[volume] VARCHAR2(4), ‘ +
 29                 ‘[remark] VARCHAR2(200), ‘ +
 30                 ‘[dateCreated] DATETIME)‘
 31             );
 32     }, function(){
 33         //alert(‘初始化表成功‘);
 34     }, function (er) {
 35         console.log(‘error with executeSql‘, er);
 36     });
 37 }
 38
 39 function initSystem() {
 40     //compass = new Compass();
 41     //compass.startWatch();
 42     //alert("罗盘成功!");
 43     window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function(fs) {
 44                 fileSystem = fs;
 45                 // isFirstLoad = false;
 46                 if (fileSystem != null) {
 47                     // alert(fileSystem.root.fullPath);
 48                     var mapFile = fileSystem.root.getDirectory("superdad/", {
 49                                 create : true,
 50                                 exclusive : false
 51                             }, function(parent) {
 52                                 //打开数据库
 53                                 openMBdb(parent.fullPath);
 54                                 // alert(mapPath);
 55                         }, function(msg) {
 56                             // alert(msg);
 57                         });
 58                 } else {
 59                     alert("数据库打开失败!");
 60                 }
 61             }, function() {
 62                 alert("数据库打开失败!");
 63             });
 64 }
 65 // enable Ext autoloader
 66 Ext.Loader.setConfig({
 67             enabled : true
 68         });
 69
 70 function openMBdb(path) {
 71             var options = {};
 72             options.storage = "external";
 73             options.path = path;
 74             fgDB = new PGSQLitePlugin(localFileName, function(dbResult, dbObject){
 75                 console.log("Database status=" + dbResult.status);
 76                 console.log("Database version=" + dbResult.version);
 77                 //fgdb = dbObject;
 78                 //alert("数据库打开成功");
 79                 if(dbResult.isNew) {
 80                     initFGdb();
 81                 }
 82             }, function(err){
 83                 console.log("Error create database::err=" + err);
 84                 alert("数据库打开失败" + err);
 85             },options);
 86 }
 87
 88 function onConfirm(button) {
 89     // alert(‘You selected button ‘ + button);
 90     if (button == 1)
 91         navigator.app.exitApp(); // 选择了确定才执行退出
 92 }
 93 // Show a custom confirmation dialog
 94 //
 95 function onBackKeyDown() {
 96     navigator.notification.confirm(‘按确定退出程序!‘, // message
 97             onConfirm, // callback to invoke with index of button pressed
 98             ‘确定要退出程序吗?‘, // title
 99             ‘确定,取消‘ // buttonLabels
100     );
101 }
102
103 // <debug>
104 Ext.Loader.setPath({
105             ‘Ext.ux‘ : ‘ux‘,
106             ‘Ext‘ : ‘lib/st2.3.1/src‘,
107             ‘WeiYang‘ : ‘app‘
108         });
109 // </debug>
110 Ext.application({
111             name : ‘WeiYang‘,    //程序名称
112             requires : [‘Ext.MessageBox‘], //引用的资源
113             models : [‘WeiYangInfo‘],    //数据模型
114             stores : [‘WeiYangStore‘],    //数据源
115             views : [‘Main‘,‘Login‘],    //视图
116             controllers : [‘MainController‘],    //控制器,
117             launch : function() {
118                 // Destroy the #appLoadingIndicator element
119                 // Ext.fly(‘appLoadingIndicator‘).destroy();
120                 //Ext.Viewport.add(Ext.create(‘WeiYang.view.Login‘));
121                 Ext.Viewport.add(Ext.create(‘WeiYang.view.Main‘));
122
123                 weinaiStore = Ext.create(‘WeiYang.store.WeiYangStore‘);
124                 muruStore = Ext.create(‘WeiYang.store.WeiYangStore‘);
125                 niaobuStore = Ext.create(‘WeiYang.store.WeiYangStore‘);
126                 tiwenStore = Ext.create(‘WeiYang.store.WeiYangStore‘);
127                 shuijiaoStore = Ext.create(‘WeiYang.store.WeiYangStore‘);
128
129                 Ext.Date.monthNames = [
130                        ‘一月‘, ‘二月‘, ‘三月‘, ‘四月‘, ‘五月‘, ‘六月‘,
131                        ‘七月‘, ‘八月‘, ‘九月‘, ‘十月‘, ‘十一月‘, ‘十二月‘
132                       ];
133
134                 Ext.Date.dayNames=["星期一", "星期二",  "星期三",  "星期四",  "星期五",  "星期六",  "星期日"];
135             },
136             // html5缓存更新
137             onUpdated : function() {
138                 Ext.Msg.confirm("更新", "系统已经自动更新到最新版本,是否重新加载?", function(
139                                 buttonId) {
140                             if (buttonId === ‘yes‘) {
141                                 window.location.reload();
142                             }
143                         });
144             }
145         });
146         

 今天先写到这里,宝宝醒了,得去冲牛奶了,下回继续说。

源代码免费提供

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

也可以先下载APK试试

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

Sencha Touch+PhoneGap打造超级奶爸之喂养记(一) 源码免费提供

时间: 2024-11-09 11:18:28

Sencha Touch+PhoneGap打造超级奶爸之喂养记(一) 源码免费提供的相关文章

Sencha Touch + PhoneGap + Html5 在Android下的性能优化

最近用Sencha Touch + PhoneGap 开发了一个产品,在IOS上运行流畅,在Android上切换页面几下就闪屏,字体也变模糊了.看上去是性能问题,GPU渲染,内存,都有可能,这绝对接受不了,得治. 团队开始分析内存,代码架构,折腾了一两周,感觉不明显,用户体验还是较差. 直到有一天,在看其他HTML5的框架中,无意提到了这点,hardwareAccelerated属性,硬件加速执行的所有的绘图操作都是使用GPU在View对象的画布上来进行的.启用硬加速最简单的的方法是对整个应用启

sencha touch+phonegap+node.js打包

这讲我们来讲解下如何使用phonegapa创建项目环境并通过她们将sencha touch打包成app,这里我们只讲解打包android的apk,打包ios的过程有点类似,但是需要在mac环境下,最后通过xcode导出成ipa安装程序: 一.phonegap环境搭建: phonegap从3.0开始已经不再使用手动的方式搭建项目了,而是使用command-line命令行工具来搭建项目环境,并且插件引入的机制也在3.0做了调整,采用了模块化的方式,即需要什么功能模块就通过命令行工具来安装对应的模块,

android 打造ListView和Gridview万能adapter适配器(附源码)

android开发中,我们离不开adapter,每个项目都有很多地方需要adapter,那么我们如何让自己少写adapter代码呢?那就是封装adapter,让我们的adapter成为万能的adapter.下面我列出我实现的思路,供给大家学习与参考,当然有更好的方式也可以提供建议哦. 一.针对Listview或GridView的万能适配器(源码) 1.第一步实现公用的viewholder/** * 优化adapter用的ViewHolder * Created by admin on 17/8/

sencha touch api 使用指南

本文主要讲解如何使用sencha touch的api以及如何查看api中官方示例源码 前期准备 1.sdk 下载地址:http://www.sencha.com/products/touch/download/ 填写对应信息及邮箱地址点Download即可,你会在邮箱里面收到下载邮件,如图所示: 随意解压到任意目录即可,如图所示: 2.api 下载地址:http://docs.sencha.com/ 点击Sencha Guides,会弹出下载界面,选择Touch进行下载,如图所示: 随意解压到任

[Phonegap+Sencha Touch] 移动开发24 打包wp8.1的App,运行时输入框聚焦弹出软键盘之后,界面上移而不恢复原位的解决办法

这个现象只出现在phonegap打包sencha touch的wp8.1程序会出现(仅wp8.1,wp8正常),其它js框架我测试了几个(app framework, jquery mobile),好像没有这个问题. 我来描述一下这个现象: 1.运行phonegap打包的wp8程序,打开一个有输入框的界面,如下图: 2.点击输入框,使其弹出软键盘,界面会上移,如下图: 3.点返回键隐藏软键盘(或者点击界面上其它地方隐藏软键盘),此时界面不恢复原位,如下图: 我的一些研究结果: 1.这种现象只出现

[Phonegap+Sencha Touch] 移动开发16 安卓webview中,input输入框不触发backspace回退键事件的解决办法

可以用安卓手机浏览器打开 http://javascript.info/tutorial/keyboard-events#test-stand-test-stand 测试看看. Android 4.2自带浏览器和webview的测试结果(其他版本没试过,估计4.X都是这样): 当input有内容的时候,点击软键盘回退键(keyCode=8),是有keyEvents事件(keyup keydown)触发的:当input是空的时候,再点击,就不触发keyEvents了. Chrome浏览器测试结果:

[Phonegap+Sencha Touch] 移动开发77 Cordova Hot Code Push插件实现自己主动更新App的Web内容

原文地址:http://blog.csdn.net/lovelyelfpop/article/details/50848524 插件地址:https://github.com/nordnet/cordova-hot-code-push 以下是我对GitHub项目readme的翻译 ---------------------------------------------- Cordova Hot Code Push Plugin 此插件提供了能够使cordova app自己主动更新web内容的功

[Phonegap+Sencha Touch] 移动开发23 Android和IOS的webview点击穿透的缓解办法

安卓的webview和自带浏览器下有个奇怪的现象. 现象: 1.如果输入框input或者textarea的正上方(z轴方向,即上层)有个div,当点击这个div使得div隐藏了之后,input会得到焦点,导致软键盘弹出. 2.浏览视图点击某个地方切换到编辑视图,如果浏览视图点击的位置 在 编辑视图相应位置有个输入框,那么切换过去之后,编辑页的输入框会自动得到焦点. 这个体验很不舒服. 讨论: 这个不是点击事件的事件冒泡导致的(因为e.stopPropagation()和return false是

[Phonegap+Sencha Touch] 移动开发29 安卓navigator.camera.getPicture得到图片的真实路径

phonegap的拍照插件选择图库中的图片,代码如下: navigator.camera.getPicture(function(uri){ console.log(uri);//这里得到图片的uri }, function(err){ console.log(err); }, { quality: 70, destinationType: navigator.camera.DestinationType.FILE_URI, sourceType: navigator.camera.Pictur