本案例所用的数据都存储在Access中,这样任何用户都可以在本地使用家庭账本,而不用为构建企业级数据库而操心。
同时本案例摒弃了服务器的支持,读者可以在本地直接打开家庭账本,并进行数据库读写操作。从而避免因为搭建服务器环境,而让广大初学者望而生畏。由于后台技术相对复杂,所以本例就避重就轻,为读者提供了一种更加轻便的家庭级Web应用解决新方案。
整个数据库(data/home.mdb)中的数据表如图1所示,表之间的关系如图2所示。数据库访问密码为admin。
为了防止数据库文件被他人恶意盗取,在发布应用时更改扩展名mdb为asp,然后在数据库连接时把数据库连接的文件名改为home.asp即可。使用Access打开数据库的访问密码为admin。
var conn = connection("家庭日志.html", "data/home.asp");
图1 home.mdb数据库和数据表
图2 home.mdb数据表关系图
本案例的数据结构相对比较复杂,特别是数据表之间的关系,相互交织在一起,很容易让人迷糊,当读者在阅读代码或者编写代码时,必须对于这个关系非常清楚,大脑高度清晰。为了方便读者理清它们之间的关系,这里以自定义数组结构的方式呈现它们复杂的关系。
//=================================== //数据表集合对象 //第1个元素表示数据表在分类表中的自动编号,0表示不存在编号 //第2个元素表示名称 //第3个元表示素映射的分类表 //第4个元素表示关联的主表id //第5个元素表示数据表分类 //第6个元素表示数据表分类类型 //第7个元素表示编号 //第8个元表示素映射的分类表 //第9个元素表示映射upperid的表格 //第10个元素表示被引用的明细表,no表示没有 var tableobj = { //表名称 明细表upperid 0 标签1 向上关联class表2 所属表ID 3 向下关联分类或明细表 4 //分类 5 编号 6 向上关联class表7 向上关联upperid表8 被多表引用9 'out' : [14, '家庭支出', "class2", 0, "outdetail", "data", 1, "class2", "no", "no"], 'income' : [15, '家庭收入', "class2", 0, "incomedetail", "data", 2, "class2", "no", "no"], 'blog' : [16, '家庭日志', "class2", 0, "blogdetail", "data", 3, "class2", "no", "no"], 'incomedetail' :[0, '收入明细', "class3", 15, "no", "detail", 4, "class3", 'income', "no"], 'outdetail' : [0, '支出明细', "class3", 14, "no", "detail", 5, "class3", 'out', "no"], 'blogdetail' : [0, '博客明细', "class3", 16, "no", "detail", 6, "class3", 'blog', "no"], 'class1' : [0, '一级分类', "no", 1, "class2", "class", 7, "no", "no", "no"], 'class2' : [0, '二级分类', "class1", 2, "class3", "class", 8, "no", "class1", ['out', 'income','[blog]']], 'class3' : [0, '三级分类', "class2", 3, "no", "class", 9, "no", "class2", ['outdetail', 'incomedetail','blogdetail']] };