小程序教程

微信小程序开发记账应用实战服务端之用户注册与登录

字号+ 作者: 来源: 2016-11-23 09:49 我要评论( )

框架下载地址:http://www.yiiframework.com/download/

选择advanced版本

初始化:项目目录给予读写权限后,打开命令行控制台,切换到项目目录,命令行执行

  1. php init
复制代码

将自动创建一系列文件:


  1. Yii Application Initialization Tool v1.0

  2. Which environment do you want the application to be initialized in?

  3.   [0] Development
  4.   [1] Production

  5.   Your choice [0-1, or "q" to quit] 0

  6.   Initialize the application under 'Development' environment? [yes|no] yes

  7.   Start initialization ...

  8.    generate backend/config/main-local.php
  9.    generate backend/config/params-local.php
  10.    generate backend/web/index-test.php
  11.    generate backend/web/index.php
  12.    generate common/config/main-local.php
  13.    generate common/config/params-local.php
  14.    generate console/config/main-local.php
  15.    generate console/config/params-local.php
  16.    generate frontend/config/main-local.php
  17.    generate frontend/config/params-local.php
  18.    generate frontend/web/index-test.php
  19.    generate frontend/web/index.php
  20.    generate tests/codeception/config/config-local.php
  21.    generate yii
  22.    generate cookie validation key in backend/config/main-local.php
  23.    generate cookie validation key in frontend/config/main-local.php
  24.       chmod 0777 backend/runtime
  25.       chmod 0777 backend/web/assets
  26.       chmod 0777 frontend/runtime
  27.       chmod 0777 frontend/web/assets
  28.       chmod 0755 yii
  29.       chmod 0755 tests/codeception/bin/yii

  30.   ... initialization completed.
复制代码

配置数据库连接

  1. <?php
  2. return [
  3.     'components' => [
  4.         'db' => [
  5.             'class' => 'yii\db\Connection',
  6.             'dsn' => 'mysql:host=localhost;dbname=yii2advanced',
  7.             'username' => 'root',
  8.             'password' => '',
  9.             'charset' => 'utf8',
  10.         ]
  11.     ],
  12. ];
复制代码

迁移数据

  1. php yii migrate
复制代码

将为我们创建好User表

  1. Yii Migration Tool (based on Yii v2.0.9)

  2. Creating migration history table "migration"...Done.
  3. Total 1 new migration to be applied:
  4.     m130524_201442_init

  5. Apply the above migration? (yes|no) [no]:yes
  6. *** applying m130524_201442_init
  7.     > create table {{%user}} ... done (time: 0.683s)
  8. *** applied m130524_201442_init (time: 0.811s)


  9. 1 migration was applied.

  10. Migrated up successfully.
复制代码

为User表增加一个openid字段

  1. ALTER TABLE  `user` ADD  `openid` VARCHAR( 255 ) NOT NULL AFTER  `updated_at`
复制代码

将字段username auth_key password_hash email设置为allow null

创建分类Category、收支Item

http://localhost/finance-web/backend/web/index.php?r=gii

流程:如果用户是首次登录,则为user表插入一条数据,并返回该用户;如果是老用户,并查询到此用户返回。微信小程序将包括用户id等信息缓存到localStorage

创建WechatLogin模型

增加openid的登录方式findByOpenid()方法

创建APIController基类,用于json格式化输出

  1. <?php
  2. namespace frontend\controllers;

  3. use yii\web\Controller;
  4. use Yii;
  5. use yii\web\Response;

  6. class APIController extends Controller
  7. {
  8.     //json方法
  9.     public function json($data, $code = 1001, $msg = '加载成功') {
  10.         Yii::$app->response->format = Response::FORMAT_JSON;
  11.         echo \yii\helpers\Json::encode(['code' => $code, 'msg' => $msg, 'data' => $data]);
  12.     }
  13. }
复制代码

创建UserController,用于登录

  1. <?php
  2. namespace frontend\controllers;

  3. use Yii;
  4. use yii\web\Controller;
  5. use common\models\WechatLogin;

  6. class UserController extends APIController
  7. {
  8. //     允许外部提交
  9.     public $enableCsrfValidation = false;
  10.     /**
  11.      * Logs in a user.
  12.      *
  13.      * @return mixed
  14.      */
  15.     public function actionLogin()
  16.     {

  17.         $model = new WechatLogin();
  18.         if ($model->load(Yii::$app->request->post()) && $model->login()) {
  19.             $this->json(\yii\helpers\ArrayHelper::toArray($model->login()), 1000, '登录成功');
  20.         } else {
  21.             $this->json([], 404, '登录失败');
  22.         }
  23.     }
  24. }
复制代码

创建微信登录Model

  1. <?php
  2. namespace common\models;

  3. use Yii;
  4. use yii\base\Model;
  5. class WechatLogin extends Model {
  6.     public $openid;
  7.     public $rememberMe = true;
  8.     private $_user;

  9.     /**
  10.      * @inheritdoc
  11.      */
  12.     public function rules()
  13.     {
  14.         return [
  15.             ['openid', 'safe'],
  16.             ['rememberMe', 'boolean'],
  17.         ];
  18.     }

  19.     public function login()
  20.     {
  21.         if ($this->validate()) {
  22.             Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
  23.             return $this->getUser();
  24.         } else {
  25.             return false;
  26.         }
  27.     }

  28.     /**
  29.      * Finds user by [[username]]
  30.      *
  31.      * @return User|null
  32.      */
  33.     protected function getUser()
  34.     {
  35.         if ($this->_user === null) {
  36.             $this->_user = $this->findByOpenid($this->openid);
  37.         }
  38.         return $this->_user;
  39.     }

  40.     /**
  41.      * 增加openid登录的方式
  42.      */

  43.     public function findByOpenid($openid) {
  44.         $user = User::findOne(['openid' => $openid]);
  45.         if ($user) {
  46.             //             如果已经用户存在
  47.             return $user;
  48.         } else {
  49.             $model = new User();
  50.             $model->openid = $openid;
  51.             $time = time();
  52.             $model->created_at = $time;
  53.             $model->created_at = $time;
  54.             $model->status = User::STATUS_ACTIVE;
  55.             if ($model->save()) {
  56.                 return $model;
  57.             }
  58.             //             创建这个用户并返回

  59.         }
  60.     }
  61. }
复制代码

到此,完成用户登录。

使用Postman测试一下。

  1. url:localhost/finance-web/frontend/web/index.php?r=user/login

  2. param:WechatLogin[openid] = 黄秀杰

  3. response:{"code":1000,"msg":"登录成功","data":{"openid":"黄秀杰","created_at":1475654180,"status":10,"updated_at":1475654180,"id":4}}
复制代码

实际操作中,发现没有appId,则不能拿到res.code,于是就解析不了openid,所以在微信开放公测之前,姑且拿nickname作为openid使用。

未完待续...


 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 微信小程序 轮播图 swiper图片组件

    微信小程序 轮播图 swiper图片组件

    2016-11-23 09:49

  • 微信小程序 开发 微信开发者工具 快捷键

    微信小程序 开发 微信开发者工具 快捷键

    2016-11-23 09:49

  • 微信小程序 页面跳转 传递参数

    微信小程序 页面跳转 传递参数

    2016-11-23 09:49

  • 微信小程序 如何获取时间

    微信小程序 如何获取时间

    2016-11-23 09:49

网友点评
"