一篇文带你从0到1了解建站及完成CMS系统编写
Posted 1_bit
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一篇文带你从0到1了解建站及完成CMS系统编写相关的知识,希望对你有一定的参考价值。
学习目标
- 了解搭建一般网站的简便方式
- 了解最原始一般站点搭建
- 了解内容管理站点搭建
- 了解权限设计及完成
- 了解使用设计模式减少代码冗余
- 了解前端拖拽页面生成及生成
- 了解自定义数据的创建
- 了解动态生成的前端页如何绑定自定义数据
开发环境
声明
文章为从0到1了解内容管理系统搭建与编写,由于一篇文章内容篇幅过长,文章内容经过压缩,该项目中相同逻辑的实现只以一个实例作为描述,主要以核心关键功能的开发作为主要的讲解步骤。如有想学习完整内容系统编写可在留言区留言,我会尽快完成完整版的实战教程发布。谢谢。本篇不涉及vue、nodejs的前端框架。
知识门槛
以下内容有过一些了解即可:
- html
- sql
- php
- tp框架
面向人群
- 刚学了php不懂怎么用的同学
- 会一点点建站但是又不清楚流程的同学
- 学习完了一些框架不懂怎么使用的同学
- 有过一些web开发经验的同学等
- 希望本篇文章对每一个阅读完的同学都有帮助
注意:本篇文章部分细节由于篇幅关系并不会去深入完善,并且相同逻辑的实现只以一个实例作为描述,主要以核心功能的开发作为主要的讲解步骤。本篇不涉及vue、nodejs的前端框架。
一、 了解一些专业术语及概念
在了解搭建网站前,需要普及一些基本的知识概念,防止某些同学在一方面有概念性的错误,并且我个人认为在学习一方面知识前需要对这一方面的知识有一个广度的了解,这里所指的广度为这东西是用来干什么的、作用是什么、为什么要这样写;所以在正式开始介绍如何编写CMS前将会介绍这一部分内容。为了方便阅读第一点内容引入我另外一篇原创文章。
1.1了解浏览一个网页的基本流程方式
在学习一门技术的时候,往往是了解整体体系架构才能更好的学习,不然在学习的过程中会出现不知道为什么这样做,做出这一部分是该整体部分的哪个区域,只会跟着做,但是并不了解这是在干啥。可能一些萌新体会颇深,就照着打,老师教怎么写,我就怎么写,反正做出来了。
本篇博文,就来用最接地气的方式对基本的web开发做一个整体的讲解,带各个萌新过一遍web开发的流程,好让各位萌新知道学习的时候学习了什么知识点,这个知识点能够干哈。
最开始,我们就以个人浏览网站的方式给大家说一下这一个过程是如何运作的。
我们访问网站,一般先打开浏览器(不要杠),输入一个网址,随后浏览器打开一个网页。在你在请求这一个网址数据的时候,已经发生了一系列的操作。
1.2了解IP地址
假设你输入的是“csdn.net”,浏览器想要去访问你这个网站,首先需要的是获得你这个网站的IP地址。可能就有萌新问了**“什么是IP地址?”。IP地址就是“指互联网协议地址,或者说网际协议地址”。又有萌新说了“你这么说我怎么懂?”**,好了现在容我慢慢道来。
IP地址就是在网络中,定位你这台电脑,或者说是设备的一个标记,这个标记是人们指定好的标准协议而产生的(协议就是你和我说好了一件事,拉钩了,以后要这样做)。就像你家的门牌号例如叫做“CSDN市,CSDN区,CSDN街道的CSDN小区第CSDN栋的第CSDN号”…这是由有关机构制定的一套规范名称,不允许随意更改;我们换个例子,例如你家是“深圳市南山区深南大道某某小区第八栋808”,你写快递的收件地址肯定是写这个,难道你写“宇宙第一星球第一市第一栋第一号”?地址是由专门组织规范且制定的一套定位规范,遵循这个规范可以使遵循该规范的设备或者人之间相互通信,这个通信指可以传达交互,能够定位、找到。综上所述,IP地址就不要纠结为什么要这样写,只要知道这个IP地址是你要用的就行。
1.3了解DNS
现在IP地址知道是什么了,那么怎么获得IP地址?这个时候就需要用到DNS了,啥是DNS??!!
DNS的英文全称是 Domain Name System,翻译过来就是域名系统。好了,这个时候问题又来了。
1.4了解域名
啥是域名?域名就是用来标识IP地址的一个标记,或者说是昵称。“为什么不直接用IP地址?”这个问题问得好,如果我们人不用名称,就用身份证号,我叫你的时候就会叫“450333333333333333…”。。。我觉得这样不是很好。。。当人们觉得使用IP地址不方便记忆后,就产生了域名地址,就像CSDN,我们就知道是CSDN就好了,难道还要去记她的IP地址吗?例如CSDN的地址是192.168.1.1,难不难受…以后可能你记网站名称就在记数字了,又不方便又崩溃。好了,回归正题,我们输入了网址后,按下Enter键后,浏览器将会去DNS请求这个域名对应的IP是什么,如果找到了,就返回一个IP地址。可能又有萌新问了,“浏览器会自动去找DNS?”,会是会,但是我们也会给它一个目标,在我们的网络连接里面,本地连接右键属性,里面有个IPV4,双击进去就可以查看自己配置的DNS了,一般别乱改,不然很难过的,有时候浏览器打不开网址,就是这个原因。
记住,网络IP冲突可能会导致上不了网,这种情况在学校的机房里很常见,只要改成自动获取IP就ok了,会自动分配闲置的IP地址。
1.5 了解数据请求
当找到了IP地址,这个时候就会向该IP地址的设备去请求数据,请求数据的意思就是,这个设备或者说服务器就像一个大型的分发机构,就是送情报的一个部门,一共有65535个窗口,每个窗口送不同的情报;例如我们需要请求网站之类的数据,就通过第80个窗口请求,这个时候浏览器派来的小弟来到这个80号窗口,可能会排一下队,拿到数据后,回到浏览器,浏览器把拿到的数据显示给你看。
1.6 了解“ 渲染”
其实在这个时候,浏览器显示的数据会根据一些标记,进行排版,这些标记就称是HTML,HTML是 Hyper Text Markup Language 的缩写,中文名是超级文本标记语言,其实说那么深奥还不方便理解;简单来说就是通过特定的标签,把一段文本信息标记起来,表示这段文本信息要怎么样去进行显示,或者是这个文本信息是啥东西;例如 <title>CSDN-专业IT技术社区</title>
是CSDN官网首页的标题,用了title这个标签把文本信息标记,标记好后,浏览器就知道这个文本要显示在哪里,要怎么进行显示,最终浏览器把这一段信息显示在了浏览器标题头位置:
我们再看看另外的一个例子:
这一段HTML语言所标记了一个博客的文本,整个标记的情况为了清晰的看清楚,我在这里列出:<a href="//blog.csdn.net/" class="toolbar_to_feed" title="博客">博客</a>
,标记语言HTML那一些标记并不会进行显示,只显示了博客这个这个文本在网页上:
那是因为浏览器是通过标记语言的内容去进行显示,标记语言的作用就是告诉浏览器这里你要怎么显示这个内容,或者说这个内容有什么功能。这里是博客的一个跳转,使用的是a标签,a标签是什么?a标签就是<a>这里是要显示的文本</a>
,在a标签里面可以添加一些固定的操作,例如a标签的作用是跳转到指定的页面,那么这个页面肯定是有一个链接的,那么这个链接需要什么来指定呢?
答案就很简单了,使用href来指定,这个href呢就需要把要跳转到的页面的地址给加上,在我们查看到的HTML代码中是href="//blog.csdn.net/"
,这就表示会跳转到blog.csdn.net
这个地址,有人点击就会跳转到博客了。
那 class="toolbar_to_feed"
是什么东西?在这里我们可以把它当做给定了一个样式,给定了一个style,要怎么样显示,你要显示的样子是什么?可能红色的底,绿色的字,俗话说,红配绿。。。这个样式的名称就叫做 toolbar_to_feed 。在这里并不会深入的讲解这个样式要让博客这个文本显示成啥样,大家只要通过例子知道这个html是用来告诉浏览器怎么样显示这个文本,或者这个文本有什么用就ok了。其实还有些动态的数据,但是在这里并不会讲解,基本的理解这样就没问题了。专业点的说法就是构件编排用户界面。
1.7 了解前端
通过以上描述就很清楚的知道,如果我们做web开发的话,做html相关的就是给页面制作布局,怎么样好看,甚至可以做特效,让页面显示多姿多彩;一般我们称做HTML这种,是为了数据的显示的排版工作,或者说是为了包装数据工作的这类职位叫做前端;不过前端是个相对概念,在web上可以这样理解是没问题的,不过现在的前端,如果不去大厂,基本上要做的不止是包装数据的排版那么简单,可能还会做得更多。如果我们去做前端工作的话,还要掌握跟服务器交互的一些操作,打个比方,用户点击了一个按钮,这个按钮的功能是获取到你们的用户人数,这个时候你需要编写一个逻辑,去服务器获取到这个用户想要的数据。不过这点只是作为一个提醒,当真正接触前端的话会了解的。
1.8 了解后端
有很多小问号的朋友可能会记得刚刚说的,前端可能要向服务器请求数据,那么这个数据,是不是就是传说中的后端做的?(听没听过后端某问题,反正就是后端)
后端可以理解为一些业务逻辑的代码编写实现,就是需要后端,什么是业务逻辑?简单的举个例子,就像你淘宝买东西,你点了这个物品,下单了,我要在代码上怎么实现这个下单这个背后的操作;因为下单后你还需要交易,交易要收钱,收钱你还要把这个记录记载到你存放数据的地方,我们可以叫做数据库,存进去后,用户查看自己的下单记录,你还需要把这个记录取出来,用代码实现这个取出来这个过程给用户看到,不然没有记录那就很尴尬了,只收钱不卖货!流批!所以一般是指的是数据库(因为要存储数据,例如你网站的用户数据,肯定要用东西来存储,这个东西就是数据库)进行交互以处理相应的业务逻辑。虽然后端要考虑很多东西,但是一般来说这样举例子就比较方便理解,就不过多的谈论其它东西了。
现在整个逻辑基本上就通了,简单的理解,后端就是实现一些数据操作,业务逻辑的实现(其实可能会运维),前端呢就是负责用户的页面数据的展示排版;嗯,大体这样理解问题不大。
1.9 了解建站
既然理解通了,我们就来说说一个网站搭建的流程是什么吧!
首先我们需要租一个服务器,嗯…这个萌新不理解,那我们降一个档次,那就是我们在我们自己的本地电脑进行试验,这样就问题不大了,方便快捷。
搭建一个简单企业门户网站其实贼简单,不吹不黑,几年前的时候,做这个还是挺得钱的,接接外包,舒舒服服,现在就不行了,毕竟技术在更新,过时的技术也变得更加廉价了,但是依旧是基本。
以下我使用一个静态网站作为例子演示一个网站的搭建;“啥是静态网站?”。静态网站就是没有后端,好吧,简单来说就是这样,由于后端需要一些其它语言,本篇博文针对于普遍人群,为了方便理解就不用后端了,直接静态网站作为演示,列出html的代码,到时候萌新们可以直接复制代码拿去自己试验,舒舒服服,美滋滋。
1.10 了解集成环境
首先我们下载一个集成环境。“啥是集成环境?”。
集成环境打个比方,就像你做菜、需要火源、锅、锅铲,这种就是环境;我做网站也要一个环境,这个环境有人给你做好了,你直接拿过来用就好,就不需要自己搭建,有些初学者就喜欢自己搭建,然后发现一堆问题,搞着搞着发现太难就不学了,简直嘤嘤嘤!初学者我个人建议先别增加自己的难度,先学,不然没搞懂就上会一脸懵圈的。现在我们下载一个叫做phpstudy的软件,下载点这里
去官网。然后进行傻瓜式安装。
安装完后打开服务:
Apache可能会有人问是什么,Apache是服务器软件,它就是你做菜需要的必要工具之一,开启了就对了,可能你只开启Apache只能做汤,那也没事,毕竟我现在演示的是静态网站。
首先我们把我们的资源文件带到网站根目录下:
根目录不会找?没关系,我们打开网站,点击管理找到根目录就ok:
找到后把资源文件放到根目录下,删除以前的根目录下的内容即可。
然后在浏览器输入:http://127.0.0.1/ 或者输入 http://localhost/ 就可以访问我们本地电脑上的网站了!
二、给所搭建的静态网站添加后端
在以上第一节内容中,我们已经做好了一个静态的网站,但该网站并没有一些后台功能。例如后台设置网页的所展示的内容,那为什么要后台设置网页展示的内容呢?当我们的网站成功架设后,假设该网站是双十一的推广网站,图片这些全部都是标有双十一字样,当双十一过后该网站难道就不能继续使用了吗?答案当然是不,只需要编写一管理后台,用户在后台中可自由设置图片要显示哪一张。该功能完成后,用户可根据自己的需要更改对应的图片;既然图片都可以更改了,那么文章也同样可以更改,这时网站的自由度将会更高。
更改网站图片的显示与更改文字内容的显示都需要使用数据库,当然其它方式也可以,但我们在这里使用一种较为常规与成熟的数据库方式进行存储,并且使用一个php的开发框架thinkphp来方便我们的搭建。thinkphp的版本是5.1版本。可能有些小伙伴们问为什么要使用框架?这不是增加学习成本吗?其实使用框架并不会增加你的开发时长,并且会增加你的开发效率;框架就像搭建房子时的地基,直接使用一个地基比你自己再去做一个地基更加简单方便,而且更为标准;如果你是一个新手,自己去搭建一个地基,往往会做到一半就“塌”了,这种情况也不是不可能。
2.1 了解thinkphp5.1 的使用
首先我们下载thinkphp5.1,解压后目录如下:
目录参考可以根据thinkpp5.1手册:
thinkphp5.1的目录结构在本文并不需要了解过多,本文将会说明需要了解的目录。
我们复制解压出来的文件至网站根目录下,并且删除原有网站根目录下的内容:
由于thinkphp框架的入口在public目录下,我们打开public目录进行查看:
在public目录下找到了index.php文件。由于该框架的入口文件是index.php,需要更改网站的根目录为public。打开phpstudy,依次点击其它菜单选项->软件设置->端口常规设置:
在弹出来的根目录设置中,选择public作为根目录:
此时输入localhost进行访问:
出现如上示例则表示当前thinkphp部署成功。接下来就可以进行相应的代码编写了。
2.2 完成第一节静态网站的移植部署
在第一节中,我们实现了一个静态网站的搭建,现在将第一节编写好的静态网站index.html文件复制到如下路径中:
我的目录是 E:\\devlop\\phpstuy\\PHPTutorial\\WWW\\application\\index\\view\\index,如果没有该目录可以自己创建。我们浏览器再次输入localhost查看,发现依旧出现之前的web页提示,这是什么回事呢?因为我们需要在thinkphp的控制器中,添加一行跳转到该html文件的代码。控制器文件在 E:\\devlop\\phpstuy\\PHPTutorial\\WWW\\application\\index\\controller 下:
该目录是存放当前模块下所有控制器的地方(当然你可以不这样),控制器在thinkphp框架中用于对用户访问进行控制,例如用户需要访问首页则需要访问首页的控制器,默认是index控制器;index控制器可以对index这个页面进行逻辑控制,可以传值、权限控制等一些列操作。换句话说则是控制用户访问指定资源的逻辑(不理解也没关系)。我们打开index.php这个控制器:
<?php
namespace app\\index\\controller;
class Index
public function index()
return '<style type="text/css">* padding: 0; margin: 0; .think_default_text padding: 4px 48px; acolor:#2E5CD5;cursor: pointer;text-decoration: none a:hovertext-decoration:underline; body background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px h1 font-size: 100px; font-weight: normal; margin-bottom: 12px; p line-height: 1.6em; font-size: 42px </style><div style="padding: 24px 48px;"> <h1>:)</h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">十年磨一剑 - 为API开发设计的高性能框架</span></p></div><script type="text/javascript" src="http://tajs.qq.com/stats?sId=9347272" charset="UTF-8"></script><script type="text/javascript" src="http://ad.topthink.com/Public/static/client.js"></script><thinkad id="ad_bd568ce7058a1091"></thinkad>';
public function hello($name = 'ThinkPHP5')
return 'hello,' . $name;
改php控制器默认index为访问方法,index方法将会返回一条html的字符串,改字符串通过渲染将会显示成我们之前所看到的部署成功的欢迎界面。在这里需要将该代码删除。换成:
return $this->view->fetch();
整个php文件则为:
<?php
namespace app\\index\\controller;
use think\\Controller;
class Index extends Controller
public function index()
return $this->view->fetch();
public function hello($name = 'ThinkPHP5')
return 'hello,' . $name;
return $this->view->fetch(); 我们可以查看thinkphp5.1手册:
使用 fetch 方法将会自动定位到模板文件。thinkphp已经帮我们写好了一定的规则,自动定位到默认view目录下对应控制器名下的index文件。在此注意,是自动定位到view目录下与控制器同名的目录下的文件,不加参数自动定位到index.html,也就是view/控制器名/index.html,由于控制器名是index,则是view/index/index.html;view目录下的index目录则是之前复制静态网站html文件的目录。
保存php文件,访问localhost:
这时发现整个web页错乱,这时因为所有css文件、js文件、img文件的路径都有所改变,这时需要更改到正确的资源加载目录。为了方便加载,在网站根目录public目录下新建一个home目录,复制该页面所需的资源文件到该目录下:
网站根目录资源的访问路径是“/”表示网站根目录下,由于在根目录下创建了一个home目录,则进一步可以写为“/home/”,在home目录下有一个asset,则可以写为“/home/assets/”,assets下的文件访问则可以根据目录进行具体访问,例如asset下的目录img有一个图片叫做1.png,那么访问则可以写成“/home/assets/img/1.png”。
了解了访问的规则后,修改index.html文件,将所有 assets/ 都更换为 /home/assets/,我使用的编辑器是 vscode,快捷键 ctrl+h 即可调出一键替换:
点击如上图中的一键替换即可完成资源内容的目录修改,随后保存,再次访问:
完美呈现,是不是贼爽?那么接下来就实现这些图片资源的可后台更换。
三、完成后台模块的编写
3.1 完成管理后台模块搭建
首先复制application目录下的index目录:
更改index-副本名为admin:
随后更改admin目录下controller目录中的index.php文件内容,原文件内容如下:
<?php
namespace app\\index\\controller;
use think\\Controller;
class Index extends Controller
public function index()
return $this->view->fetch();
更改为:
<?php
namespace app\\admin\\controller;
use think\\Controller;
class Index extends Controller
public function index()
return $this->view->fetch();
以上的内容主要更改在命名空间,从 namespace app\\index\\controller;更改为了 namespace app\\admin\\controller;。命名空间主要是为了区分不同区域或空间内的不同“东西”。例如学校中A班的小明与B班的小明,这两者有着班别的区别,命名空间也是如此,表示不同区域不同空间内的值。
更改完成后访问 http://localhost/index.php/admin/index,这行url地址表示该网站中admin模块下的index方法,其中index.php在访问首页的时候是默认隐藏,即http://localhost/index.php等于localhost,由于当下访问其他模块在此需要写全(当然可以配置隐藏,但不是本节内容则不过多增加难度)。访问后发现该页面与访问localhost出现的内容一致,这是因为admin模块中的index方法也用了return $this->view->fetch();这一行代码输出了html文件的代码,这个html文件并不是index模块下的view/index下的index.html,而是admin模块下的view/index下的index.html,因为刚刚整个模块我们都进行了复制。这时该html不符合我们的需求,需要更换html内容,在此我使用了一模板(该模板编写是前端内容,在此并不过多赘述,实现逻辑与index.html类型,均是修改页面的资源路径即可),访问效果如下:
注:本节项目代码将会打包分享给大家。
3.2 完成数据库的导入
完成后台管理页的搭建后,发现该后台所有用户均可访问,这对于一个网站是不好的权限行为;必须实现可控的权限管理,使得网站内容不得随意更改。
首先打开sqlyog,输入数据库的帐号密码,一般帐号为root密码为root或空:
连接成功后,邮件你本地数据库点击创建数据:
输入数据库名,我创建数据库名为minimalism_cms,并且选择字符集,字符集为utf8即可,点击创建:
在出现的新建数据库中,选择创建表:
输入表信息如以下:
以上所有所需的数据库表我将会导出sql文件,同学们使用时在数据库导入即可,导入步骤如下:
在对应数据库中右键选择导入点击执行sql脚本即可。
导入完将会出现如下的数据库表:
以上数据库表考虑排错等操作并没有过多约束。
3.3 完成权限内容添加功能编写
权限管理首先需要有账户,账户属于什么角色,该角色又有什么权限,这是实现权限管理的思想。例如有个账户名为admin,admin属于超级管理员这个角色,该角色拥有所有的权限。接下来首先创建管理员用户。
在权限管理下拉列表中选择管理员管理进入页面:
我们查看url连接:http://localhost/index.php/admin/auth/adminauth.html
以上链接中,admin表示admin这个模块,auth表示控制器,adminauth表示方法名;auth控制器我们还未创建,在admin模块下的index控制器同目录创建一个名为Auth.php文件,内容如下:
<?php
/**
* |-----------------------
* | 页面跳转
* |-----------------------
*/
namespace app\\admin\\controller;
use think\\Controller;
class Auth extends Controller
//Auth 管理首页
public function adminAuth()
return $this->view->fetch();
通过以上控制器,可以使url连接访问到该控制器并且访问adminAuth所对应的html文件,该html对应的文件在view目录下的auth目录中。在thinkphp中,对应的view目录根据控制器名分配,Auth控制器需要一个名为auth的目录存放该控制器下的html文件;在auth目录下创建一个名为admin_auth的html文件,为什么要名为admin_auth?thinkphp会访问方法名默认控制器对应的目录中一同方法名的html文件,如方法名有大写,则表示在该名称前有一下划线,则adminAuth则为admin_auth。该html代码将会打包下载即用。
点击添加,添加管理员进入页面:
该url为:http://localhost/index.php/admin/auth/adminadd.html
在控制器中添加方法:
<?php
/**
* |-----------------------
* | 页面跳转
* |-----------------------
*/
namespace app\\admin\\controller;
use think\\Controller;
class Auth extends Controller
//Auth 管理首页
public function adminAuth()
return $this->view->fetch();
//管理员添加页
public function adminAdd()
return $this->view->fetch();
该页面拥有管理员账户、管理员密码、名称及角色组内容。暂时我们并没有角色组,首先创建一个管理员账户。查看html中的关键代码:
<form class="form-horizontal" role="form">
<div class="form-group">
<label class="col-md-2 control-label">管理员账户</label>
<div class="col-md-10">
<input id="user" type="text" class="form-control" placeholder="帐号">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">管理员密码</label>
<div class="col-md-10">
<input id="password" type="password" class="form-control" placeholder="密码">
</div>
</div>
<div class="form-group">
<label class="col-md-2 control-label">名称</label>
<div class="col-md-10">
<input id="realname" type="text" class="form-control" placeholder="输入名称或代号">
</div>
</div>
</form>
通过以上html得知,id为user是账户,id为password为密码,id为realname为真实姓名。在此使用ajax进行数据提交到php后台实现内容访问。查看ajax代码:
<script>
function add()
var user=$('#user').val();
var password=$('#password').val();
var realname=$('#realname').val();
$.ajax(
type:'post',
url:'/index.php?s=/admin/Authpost/adminAdd/',
data:"user":user,"password":md5(password),"realname":realname,"group":group,
dataType:"json",
success:function(data)
if(data.success==1)
alert(data.msg);
else
alert(data.msg);
,error:function(jqXHR)
)
</script>
从以上ajax代码中,使用jq获取了id为user、password、realname元素的值,在此并没有做检查是否合规,希望小伙伴们在使用该代码的时候注意。在获取密码时使用了md5加密,md5我是在线引入的,引入如下:
<script src="https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.js"></script>
获取值后使用ajax传递给 /index.php?s=/admin/Authpost/adminAdd/ 这个url地址。该地址使用了兼容模式,因为担心一些同学本地环境有问题,所以特地在此使用该模式进行传值。该模式的格式为:http://serverName/index.php(或者其它应用入口文件)?s=/模块/控制器/操作/[参数名/参数值…]。则admin为模块名,Authpost表示控制器名,adminAdd表示控制器中的方法。我们在admin的控制器目录创建一个名为Authpost的控制器,并且编写adminAdd方法,代码如下:
<?php
/**
* |-----------------------
* | 对数据库操作
* |-----------------------
*/
namespace app一篇文带你从入门到发布了解 uni-app
致Andorid初学者-从入门到精通,这一篇文带你省略学习路上的歪歪扭扭