开源项目案例 - 微信小程序

优质
小牛编辑
135浏览
2023-12-01

本示例将演示如何使用 easyswoole 进行小程序开发,使用 http web server 模式。阅读本教程前,请先完成文档的阅读工作。

第一章 控制器、方法与请求

准备阶段

请先完成 框架安装 的步骤。在本示例中,请先运行 php easyswoole install

安装好运行时环境,安装好的的目录结构如下所示:

  1. project 项目部署目录
  2. ----------------------------------
  3. ├─Log 日志目录
  4. ├─Temp 缓存目录
  5. ├─vendor 框架及库目录
  6. ├─config.php 配置文件
  7. ├─easyswoole 命令行
  8. ├─easyswoole.install 命令行安装表示
  9. ├─EasySwooleEvent.php 主事件配置文件
  10. ----------------------------------

配置小程序使用的目录结构

首先创建 Application 目录,并在该目录下创建 HttpControllerUtility 目录。easywoole 用户编写的程序将从 Application 目录下访问。创建好的目录结构如下:

  1. project 项目部署目录
  2. ----------------------------------
  3. ├─Application 应用程序目录
  4. │ └─HttpController WEB应用的控制器目录
  5. │ └─Utility 应用相关工具类目录
  6. ├─Log 日志目录
  7. ├─Temp 缓存目录
  8. ├─vendor 框架及库目录
  9. ├─config.php 配置文件
  10. ├─easyswoole 命令行
  11. ├─easyswoole.install 命令行安装表示
  12. ├─EasySwooleEvent.php 主事件配置文件
  13. ----------------------------------

创建首个文件

由于框架应用程序目录设置灵活,所以创建 Application 文件夹后,需要在 composer.json 中进行注册,以后程序即可从该目录下执行相关文件。

  1. {
  2. "autoload": {
  3. "psr-4": {
  4. "App\\": "Application/"
  5. }
  6. },
  7. "require": {
  8. "easyswoole/easyswoole": "2.x-dev"
  9. }
  10. }

执行 composer dumpautoload 命令更新命名空间,框架就可以自动加载 Application 目录下的文件了,确认以上操作均正确执行。以上内容在安装框架的章节中已经提及,在此只是做一个强调。

接下来在 HttpController 目录创建 Base.php 文件,用来继承 easyswoole 主控制器,在该文件里,我们将创建几个方法用来在所有控制器里使用。

  1. <?php
  2. namespace App\HttpController;
  3. use EasySwoole\Config;
  4. use EasySwoole\Core\Component\Di;
  5. use EasySwoole\Core\Http\AbstractInterface\Controller;
  6. use EasySwoole\Core\Component\Logger;
  7. use EasySwoole\Core\Http\Request;
  8. use EasySwoole\Core\Http\Response;
  9. class Base extends Controller
  10. {
  11. //用来返回错误信息(json)
  12. function error($code, $message){
  13. if(!$this->response()->isEndResponse()){
  14. $data = Array(
  15. "code" => $code ,
  16. "result" => "",
  17. "msg" => $message
  18. );
  19. $this->response()->write(json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
  20. $this->response()->withHeader('Content-type','application/json;charset=utf-8');
  21. $this->response()->withStatus(200);
  22. return true;
  23. }else{
  24. trigger_error("response has end");
  25. return false;
  26. }
  27. }
  28. //用来返回成功信息(json)
  29. function success($result = '', $code=0){
  30. if(!$this->response()->isEndResponse()){
  31. $data = Array(
  32. "code"=>$code,
  33. "result"=>$result
  34. );
  35. $this->response()->write(json_encode($data,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES));
  36. $this->response()->withHeader('Content-type','application/json;charset=utf-8');
  37. $this->response()->withStatus(200);
  38. return true;
  39. }else{
  40. trigger_error("response has end");
  41. return false;
  42. }
  43. }
  44. // controller 类必须实现该抽象方法,不然会报错
  45. function index()
  46. {
  47. parent::index();
  48. }
  49. }

接下来在 HttpController 目录创建建 Wechat.php 文件,该类继承 base.php 控制器,在该文件里,我们将创建微信登陆相关的操作方法。

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: anythink
  5. * Date: 2018/3/28
  6. * Time: 上午11:17
  7. */
  8. namespace App\HttpController;
  9. use EasySwoole\Config;
  10. use EasySwoole\Core\Component\Logger;
  11. use EasySwoole\Core\Http\AbstractInterface\Controller;
  12. use EasySwoole\Core\Http\Request;
  13. use EasySwoole\Core\Http\Response;
  14. class Wechat extends Base
  15. {
  16. function index()
  17. {
  18. $this->response()->write('hello world');
  19. }
  20. protected function getMiniProgramConfig(){
  21. return [
  22. 'app_id' => 'appid',
  23. 'secret' => 'appsecret',
  24. 'response_type' => 'array',
  25. 'log' => [
  26. 'level' => 'debug',
  27. 'file' => Config::getInstance()->getConf('LOG_DIR').'/wechat.log',
  28. ],
  29. ];
  30. }
  31. function getToken(){ }
  32. function login(){ }
  33. }

Wechat.php 类中,我们要实现两个方法 getToken 以及 login。下一节,将介绍小程序登录的流程。

小程序登录获取session_key

小程序登录流程需要访问 微信公众平台开发文档 https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html

简单说,我们需要使用微信小程序的两个接口 wx.login、wx.getUserInfo。

wx.login在小程序中调用后会携带参数code,请求我们自己的服务器,服务器通过 appid secret code请求微信服务器换回 session_key,至于这个 session_key 的用途将在下一节说明。

如下js请创建一个模板小程序替换APP.js里 onLaunch 的内容。然后刷新,就可以看到请求。

  1. //app.js
  2. //app.js
  3. App({
  4. onLaunch: function () {
  5. wx.login({
  6. success: function (res) {
  7. //发起网络请求
  8. wx.request({
  9. url: 'http://localhost:9501/wechat/getToken',
  10. data: {
  11. code: res.code,
  12. },
  13. success: function(res){
  14. //获取session_key 由于微信自己封装了一层data,所以我们需要使用res.data.result才能回去接口返回对的result
  15. var session_key = res.data.result.session_key;
  16. //todo 下面准备第二个请求
  17. }
  18. })
  19. }
  20. });
  21. }
  22. })

接下来看服务端

我们可以用一个第三方的微信开发SDK来简化我们与微信服务器的交互,在工作目录执行命令 composer require overtrue/wechat:~4.0 安装easywechat,或者
打开composer.json 在之前的require基础上追加内容 overtrue/wechat": "~4.0 注意如果是两行内容,第一行json需要增加逗号。

  1. {
  2. "require": {
  3. "easyswoole/easyswoole": "2.x-dev",
  4. "overtrue/wechat": "~4.0"
  5. }
  6. }

继续执行composer update 安装新库。执行完毕后请在 Wechat.php 中增加相关use以便引用

  1. <?php
  2. //增加如下USE
  3. use EasyWeChat\Factory;
  4. use EasyWeChat\Kernel\Exceptions\DecryptException;
  5. class Wechat extends Base
  6. {
  7. //现在来实现getToken方法
  8. function getToken(){
  9. //从小程序端接受code
  10. $code = $this->request()->getQueryParam('code');
  11. //初始化EasyWeChat,设置配置文件(也可以写在config.php中)这里为了方便就直接写在类里
  12. $app = Factory::miniProgram($this->getMiniProgramConfig());
  13. try {
  14. //执行外部请求,将从微信服务器获取 session_key,注意目前这个是同步操作
  15. $ret = $app->auth->session($code);
  16. if(!isset($ret['session_key'])){
  17. logger::getInstance()->log('微信session_key获取失败:('.$ret['errcode'].')'.$ret['errmsg']);
  18. throw new \Exception('系统繁忙,请稍后再试', 101);
  19. }
  20. //返回成功后将 session_key 回传给小程序,以便执行第二阶段。
  21. $this->success($ret);
  22. }catch (\Exception $e){
  23. $this->error($e->getCode(),$e->getMessage());
  24. }
  25. }
  26. }

以上,就是通过微信小程序中的请求获取 session_key 的步骤,下一节将说明如何通过 session_key 获取用户信息。

小程序登录获取用户资料

换取 session_key 的目的是因为我们登录的时候需要获得微信用户的昵称、头像、openid信息。这些信息将会保存到数据库以便用户下次登录,然而获取用户信息需要先获取 session_key

我们需要在 wx.login 调用成功后 再请求 wx.getUserInfo, 成功后将 wx.login 返回的 session_key 带上,加上 wx.getUserInfo 返回的 encryptedData iv 一起带上,然后请求服务器。

由于返回的数据是加密的,所以我们在服务端要进行解密,这也是 login 方法要实现的。

  1. app.js
  2. wx.login({
  3. success: function (res) {
  4. //发起网络请求
  5. wx.request({
  6. url: 'http://localhost:9501/wechat/getToken',
  7. data: {
  8. code: res.code,
  9. },
  10. success: function(res){
  11. var session_key = res.data.result.session_key;
  12. //下面是我们调用该方法获得加密信息以及iv
  13. wx.getUserInfo({
  14. success: function (res) {
  15. console.log(res);
  16. //发起网络请求
  17. wx.request({
  18. //使用POST方法发送
  19. method: 'POST',
  20. url: 'http://localhost:9501/wechat/login',
  21. //POST方法要加该header头,否则POST过去没有参数
  22. header: {
  23. "Content-Type": "application/x-www-form-urlencoded",
  24. },
  25. data: {
  26. //这个 session_key 则是 wx.login 登录成功后请求我们getToken返回的
  27. session_key: session_key,
  28. encryptedData: res.encryptedData,
  29. iv: res.iv,
  30. signature: res.signature
  31. }, success: function (res) {
  32. console.log(res);
  33. }
  34. })
  35. }
  36. });
  37. }
  38. })
  39. }
  40. });

现在看下login方法的实现

  1. <?php
  2. use EasySwoole\Core\Http\AbstractInterface\Controller;
  3. use EasySwoole\Core\Component\Logger;
  4. use EasySwoole\Core\Http\Request;
  5. use EasySwoole\Core\Http\Response;
  6. //增加如下USE
  7. use EasyWeChat\Factory;
  8. use EasyWeChat\Kernel\Exceptions\DecryptException;
  9. class Wechat extends Base
  10. {
  11. function login(){
  12. $app = Factory::miniProgram($this->getMiniProgramConfig());
  13. //获取POST的参数
  14. $args = $this->request()->getParsedBody();
  15. try{
  16. //解密用户信息
  17. $res = $app->encryptor->decryptData($args['session_key'], $args['iv'], $args['encryptedData']);
  18. if(!$res){
  19. $this->error(105,'获取用户信息失败,请稍后再试');
  20. }
  21. //解密成功返回openid (这只是demo,下一节将加入加密解密用户token)
  22. $this->success($res['openId']);
  23. //接一下解密异常的exception
  24. }catch(DecryptException $e){
  25. $this->error(102, '解密数据错误,请重新登录');
  26. }catch (\Exception $e){
  27. $this->error($e->getCode(), $e->getMessage());
  28. }
  29. }
  30. }

以上就完成了微信小程序登录的全过程。实际使用时我们需要对 success方法返回的 openId 进行加密以便在客户端传递。目前还没涉及到数据库保存的过程,将在下一章提供。

生成访问Token

Utility目录下创建 Tools.php文件,用来存放加密解密方法。

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: anythink
  5. * Date: 2018/3/28
  6. * Time: 下午5:19
  7. */
  8. namespace App\Utility;
  9. use EasySwoole\Config;
  10. use EasySwoole\Core\Component\Logger;
  11. class Tools{
  12. /**
  13. * 加解密
  14. * @param $data
  15. * @return string
  16. */
  17. public static function decryptWithOpenssl($data){
  18. $key = Config::getInstance()->getConf('ENCRYPT.key');
  19. $iv = Config::getInstance()->getConf('ENCRYPT.iv');
  20. return openssl_decrypt(base64_decode($data),"AES-128-CBC",$key,OPENSSL_RAW_DATA,$iv);
  21. }
  22. public static function encryptWithOpenssl($data){
  23. $key = Config::getInstance()->getConf('ENCRYPT.key');
  24. $iv = Config::getInstance()->getConf('ENCRYPT.iv');
  25. return base64_encode(openssl_encrypt($data,"AES-128-CBC",$key,OPENSSL_RAW_DATA,$iv));
  26. }
  27. /**构建会话加密函数,默认30天超时
  28. * @param $openid
  29. * @param int $exptime
  30. * @return string
  31. */
  32. public static function sessionEncrypt($openid, $exptime=2592000){
  33. $exptime = time() + $exptime;
  34. return self::encryptWithOpenssl($openid.'|'.$exptime);
  35. }
  36. /**
  37. * 验证会话token是否有效
  38. * @param $raw
  39. * @return bool
  40. */
  41. public static function sessionCheckToken($raw){
  42. //如果解密不出文本返回失败
  43. if(!$data = self::decryptWithOpenssl($raw)){
  44. Logger::getInstance()->console('解密不出文本');
  45. return false;
  46. }
  47. Logger::getInstance()->console($data);
  48. $token = explode('|', $data);
  49. //如果分离出来的openid或者exptime为空 返回失败
  50. if(!isset($token[0]) || !isset($token[1])){
  51. Logger::getInstance()->console('分离不出openid exptime');
  52. return false;
  53. }
  54. //如果时间过期,返回失败
  55. if( $token[1] < time()){
  56. Logger::getInstance()->console('时间过期于:' . date('Y-m-d', $token[1] ));
  57. return false;
  58. }
  59. return true;
  60. }
  61. }

在配置文件中增加加密解密使用的密钥

  1. <?php
  2. return [
  3. //部分配置
  4. 'ENCRYPT' => [
  5. 'key' => 'aaa',
  6. 'iv' => '注意iv必须是16位的字符串不要多了少了',
  7. ],
  8. ];

然后我们在 vwechat.php 增加这个工具类的调用方法 use App\Utility\Tools;

修改 login 方法的 success为下列内容。

  1. $this->success(['session_id' => Tools::sessionEncrypt($res['openId'])]);

最后在需要验证身份的地方使用 Tools::sessionCheckToken($token) 来验证令牌有效性。

小节

以上就完成了用户登录的过程及会话维持,但是还没涉及数据保存。下一章将配合这个示例完成数据操作的部分。

最后是 Wechat.php 全部实现的代码。

  1. /**
  2. * Created by PhpStorm.
  3. * User: anythink
  4. * Date: 2018/3/28
  5. * Time: 上午11:17
  6. */
  7. namespace App\HttpController;
  8. use EasySwoole\Config;
  9. use EasySwoole\Core\Component\Di;
  10. use EasySwoole\Core\Component\Logger;
  11. use EasySwoole\Core\Http\AbstractInterface\Controller;
  12. use EasySwoole\Core\Http\Request;
  13. use EasySwoole\Core\Http\Response;
  14. use EasyWeChat\Factory;
  15. use EasyWeChat\Kernel\Exceptions\DecryptException;
  16. use App\Utility\Tools;
  17. class Wechat extends Base
  18. {
  19. function index()
  20. {
  21. $this->response()->write('hello world');
  22. }
  23. protected function getMiniProgramConfig(){
  24. return [
  25. 'app_id' => 'wxf921803dd497f1d9',
  26. 'secret' => 'f4d61f43a6ceb08897f7921f4215fa49',
  27. 'response_type' => 'array',
  28. 'log' => [
  29. 'level' => 'debug',
  30. 'file' => Config::getInstance()->getConf('LOG_DIR').'/wechat.log',
  31. ],
  32. ];
  33. }
  34. function getToken(){
  35. $code = $this->request()->getQueryParam('code');
  36. $app = Factory::miniProgram($this->getMiniProgramConfig());
  37. try {
  38. $ret = $app->auth->session($code);
  39. if(!isset($ret['session_key'])){
  40. logger::getInstance()->log('微信session_key获取失败:('.$ret['errcode'].')'.$ret['errmsg']);
  41. throw new \Exception('系统繁忙,请稍后再试', 101);
  42. }
  43. $this->success($ret);
  44. }catch (\Exception $e){
  45. $this->error($e->getCode(),$e->getMessage());
  46. }
  47. }
  48. function login(){
  49. $app = Factory::miniProgram($this->getMiniProgramConfig());
  50. $args = $this->request()->getParsedBody();
  51. try{
  52. $res = $app->encryptor->decryptData($args['session_key'], $args['iv'], $args['encryptedData']);
  53. if(!$res){
  54. $this->error(105,'获取用户信息失败,请稍后再试');
  55. }
  56. print_r($res);
  57. $this->success(['session_id' => Tools::sessionEncrypt($res['openId'])]);
  58. }catch(DecryptException $e){
  59. $this->error(102, '解密数据错误,请重新登录');
  60. }catch (\Exception $e){
  61. $this->error($e->getCode(), $e->getMessage());
  62. }
  63. }
  64. function check(){
  65. $header = $this->request()->getHeaders();
  66. print_r($header);
  67. if(!isset($header['authorization'])){
  68. $this->error(103,'access denied');
  69. }
  70. list ($bearer, $token) = explode(' ',$header['authorization'][0]);
  71. if(!$token){
  72. $this->error(104,'token error');
  73. }
  74. if(Tools::sessionCheckToken($token)){
  75. $this->success();
  76. }else{
  77. $this->error(106,'check token error');
  78. }
  79. }
  80. }

第二章 数据库交互

创建数据模型

在第一章演示了如何创建控制器,如何请求微信小程序的接口获取用户信息,但是还没有执行数据库保存的操作,本章示例将演示如何创建数据模型来进行数据保存。

本示例使用了文档中提供的 MysqliDb 库,下面先进行安装。

安装方法:

  1. composer require joshcam/mysqli-database-class:dev-master

或者修改 composer.json 文件,在对应的结构中添加如下内容,然后执行 composer update 下载库文件并自动创建加载

  1. "autoload": {
  2. "psr-4": {
  3. "MysqliDb" : "App/Vendor/Db/MysqliDb.php"
  4. }
  5. }

接下来对配置文件进行扩充,需要增加 Mysql 的配置文件:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: yf
  5. * Date: 2017/12/30
  6. * Time: 下午10:59
  7. */
  8. return [
  9. //...
  10. 'MYSQL'=>[
  11. 'host' => '127.0.0.1',
  12. 'username' => 'root',
  13. 'password' => '123456',
  14. 'db' => 'test',
  15. 'port' => 3306,
  16. 'charset' => 'utf8',
  17. 'trace' => true,
  18. ]
  19. //...
  20. ];

然后在 Application/Utility 文件夹创建文件 Db.php 用来对数据库相关的操作做初始化,请看代码:

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: anythink
  5. * Date: 2018/3/29
  6. * Time: 下午3:30
  7. */
  8. namespace App\Utility;
  9. //加载配置文件
  10. use EasySwoole\Config;
  11. class Db
  12. {
  13. private $db;
  14. function __construct()
  15. {
  16. //读取配置文件
  17. if(!$this->db = Di::getInstance()->get('MYSQL')){
  18. $config = Config::getInstance()->getConf('MYSQL');
  19. $this->db = Di::getInstance()->set('MYSQL',\MysqliDb::class, $config);
  20. $this->db->setTrace($config['trace']);
  21. //如果要添加主从配置可以使用下面方法继续添加配置
  22. //$this->db->addConnection('slave', $c);
  23. }
  24. }
  25. //返回实例化的对象
  26. function link()
  27. {
  28. return $this->db;
  29. }
  30. }

下一步我们需要创建模型,并且让模型继承该类以便直接使用数据库连接。

Application 目录下创建 Model 目录,或根据自己喜好创建存放模型的对应目录。

Model 目录创建 Profile.php 文件,用来保存用户信息。

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: anythink
  5. * Date: 2018/3/29
  6. * Time: 下午3:33
  7. */
  8. namespace App\Model;
  9. use EasySwoole\Core\Component\Di;
  10. Use EasySwoole\Core\Component\logger;
  11. //需要在这里引入Db类,它负责创建数据库的连接和执行一些通用的数据库操作
  12. use App\Utility\Db;
  13. class Profile extends Db
  14. {
  15. //设置表名称
  16. private $table = 'profile';
  17. //获取或新增数据,这里我们传了两个参数 openid 和 data, data是微信接口返回的我们解密后的数据
  18. function getOrInsert($openid, $data){
  19. if($uid = $this->getUserByOpenID($openid)){
  20. logger::getInstance()->console('getUserByOpenID : ' . $uid);
  21. return $uid;
  22. }
  23. //格式化需要插入的数据
  24. $row = $this->buildInsertData($data);
  25. //获取数据库连接,并执行插入,如果插入成功则返回自增id,没有自增id返回true。
  26. $insertId = $this->link()->insert($this->table, $row);
  27. logger::getInstance()->console('getOrInsert : ' . $insertId);
  28. return $insertId;
  29. }
  30. //检查openid 是否已经创建,如果创建直接返回ui都给用户
  31. private function getUserByOpenID($openid){
  32. logger::getInstance()->console('getUserByOpenID : ' . $openid);
  33. $res = $this->link()->where ('openId', $openid)->get($this->table, null, 'uid');
  34. return !empty($res) ?: $res['uid'];
  35. }
  36. //格式化一下要插入的数据不要让不存在的字段加入数组
  37. private function buildInsertData($params){
  38. return [
  39. 'openId' => $params['openId'],
  40. 'nickName' => $params['nickName'],
  41. 'gender' => $params['gender'],
  42. 'language' => $params['language'],
  43. 'city' => $params['city'],
  44. 'province' => $params['province'],
  45. 'country' => $params['country'],
  46. 'avatarUrl' => $params['avatarUrl'],
  47. ];
  48. }
  49. }

最后我们需要修改一下之前 HttpController 目录下文件 Wechat.phplogin 方法。

  1. //找到
  2. $this->success(['session_id' => Tools::sessionTokenBuild($res['openId'])]);
  3. //替换成
  4. if( $uid = (new Profile())->getOrInsert($res['openId'], $res)){
  5. $this->success(['session_id' => Tools::sessionTokenBuild($uid)]);
  6. }

数据表:

  1. -- phpMyAdmin SQL Dump
  2. -- version 4.6.5.2
  3. -- https://www.phpmyadmin.net/
  4. --
  5. -- Host: 127.0.0.1
  6. -- Generation Time: 2018-03-30 02:47:14
  7. -- 服务器版本: 5.7.17
  8. -- PHP Version: 7.2.3
  9. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  10. SET time_zone = "+00:00";
  11. /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
  12. /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
  13. /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
  14. /*!40101 SET NAMES utf8mb4 */;
  15. --
  16. -- 表的结构 `profile`
  17. --
  18. CREATE TABLE `profile` (
  19. `uid` int(10) NOT NULL,
  20. `openId` varchar(50) NOT NULL,
  21. `nickName` varchar(50) DEFAULT NULL,
  22. `gender` tinyint(1) NOT NULL,
  23. `language` varchar(20) NOT NULL,
  24. `city` varchar(20) NOT NULL,
  25. `province` varchar(20) NOT NULL,
  26. `country` varchar(20) NOT NULL,
  27. `avatarUrl` varchar(200) NOT NULL
  28. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息';
  29. --
  30. -- 转存表中的数据 `profile`
  31. --
  32. INSERT INTO `profile` (`uid`, `openId`, `nickName`, `gender`, `language`, `city`, `province`, `country`, `avatarUrl`) VALUES
  33. (1, 'oKc4D5vJFxJZd7CDuPLcDoeq-W2s', '幻之羽翼', 1, 'zh_CN', 'Chaoyang', 'Beijing', 'China', 'https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83eqJKSzUQ5nlbna7910sL06Ea7UgcK5iaUl95hlucibhic5LuP1SQPYEcF23KmvToU3a2HLzXOhibcuPdA/0');
  34. --
  35. -- Indexes for dumped tables
  36. --
  37. --
  38. -- Indexes for table `profile`
  39. --
  40. ALTER TABLE `profile`
  41. ADD PRIMARY KEY (`uid`),
  42. ADD KEY `open_id` (`openId`);
  43. --
  44. -- Indexes for table `question`
  45. --
  46. ALTER TABLE `question`
  47. ADD PRIMARY KEY (`id`),
  48. ADD KEY `is_public` (`is_public`),
  49. ADD KEY `title` (`title`);
  50. --
  51. -- 在导出的表使用AUTO_INCREMENT
  52. --
  53. --
  54. -- 使用表AUTO_INCREMENT `profile`
  55. --
  56. ALTER TABLE `profile`
  57. MODIFY `uid` int(10) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

OK,看起来我们成功的完成了数据库的保存,本章示例到此就结束了。

如果有任何疑问,可以在群里联系幻の羽翼,我会收集大家的疑问不断更新该示例。