第15讲 ionic用户个人中心登录注册的实现

这一讲包括登陆、注册、个人中心、个人资料页面的实现。

在一讲的改动有四个地方:

  1. 在config.js里配置接口地址
  2. 完善个人中心的服务层(service)
  3. 完善个人中心的控制器部分(controller)
  4. 完善个人中心的视图部分(view)
  5. 登陆注册的视图部分(view)

[效果图]

1.在config.js里配置接口地址

var settings = {
    client_id: '122440',
    client_secret: '576ec4d35f1b59363ef51171bc95421a',
    rows: 10
}

var server = {
    domain: "http://www.tngou.net/api",
    imgUrl: "http://tnfs.tngou.net/image"
}

var urls = {
    info_show: server.domain + "/info/show?id=",
    login: server.domain + '/oauth2/login?callback=JSON_CALLBACK&client_id=' + settings.client_id + '&client_secret=' + settings.client_secret,
    reg: server.domain + '/oauth2/reg?callback=JSON_CALLBACK&client_id=' + settings.client_id + '&client_secret=' + settings.client_secret,
    user: server.domain + '/user?callback=JSON_CALLBACK',
    favorite: server.domain + '/my/favorite',
    favoriteAdd: server.domain + '/favorite/add',
    favoriteDelete: server.domain + '/favorite/delete',
}

var cache = {
    user: "_user",
    token: '_token'
}

说明:

  1. client_id 开发者id
  2. client_secert 请求凭证

2.完善个人中心的服务层(service)

.service('AccountService', function ($http) {
var $this = this;
// 获取缓存用户信息
this.getCacheUser = function () {
  return angular.fromJson(window.localStorage[cache.user]);
}

// 登陆
this.login = function (name, password, callback) {
  var url = urls.login + "&name=" + name + "&password=" + password;
  $http.jsonp(url).success(function (response) {
    if (response.status == true) {
      window.localStorage[cache.token] = response.access_token;
      $this.user(callback);
    } else {
      alert("用户名和密码不匹配!");
    }
  })
}
// 获取信息
this.user = function (callback) {
  var url = urls.user + "&access_token=" + window.localStorage[cache.token];
  $http.jsonp(url).success(function (response) {
    console.log(response);
    window.localStorage[cache.user] = angular.toJson(response);
    callback(response)
  })
}

// 注册
this.reg = function (account, email, password) {
  var url = urls.reg + "&account=" + account + "&email=" + email + "&password=" + password;
  $http.jsonp(url).success(function (response) {
    if (response.status == false) {
      alert(response.msg);
    } else {
      window.localStorage[cache.token] = response.access_token;
    }
  })
}

//获取收藏列表
this.getFavorites = function (page) {
  var url = urls.favorite + "?page=" + page + "&rows" + settings.rows + "&access_token=" + window.localStorage[cache.token];
  return $http.jsonp(url);
}
//删除收藏
this.deleteFav = function (id, type) {
  var url = urls.favoriteDelete + "?id=" + id + "&type=" + type + "&access_token=" + window.localStorage[cache.token]
  return $http.jsonp(url);
}
//添加收藏
this.addFav = function (id, type, title) {
  var url = urls.favoriteAdd + "?id=" + id + "&type=" + type + "&title=" + title + "&access_token=" + window.localStorage[cache.token]
  return $http.jsonp(url);
}
})

3.完善个人中心的控制器部分(controller)

.controller('AccountCtrl', function ($scope, $rootScope, $ionicPopup, $ionicModal, $state, $ionicTabsDelegate, $ionicSlideBoxDelegate, AccountService) {

    $rootScope.isLogin = false;
    $ionicModal.fromTemplateUrl('templates/tab-account-login.html', {
        scope: $scope,
        animation: 'slide-in-up'
    }).then(function (modal) {
        $scope.modal = modal;
    });

    $scope.loginData = {
        name: '',
        password: ''
    }

    $scope.regData = {
        account: '',
        email: '',
        password: ''
    }

    $scope.user = {
        account: "未登陆"
    }
    $scope.login = function () {
        AccountService.login($scope.loginData.name, $scope.loginData.password, function (user) {
            //account avatar domain  email  gender id integral isemail isphone status time title weiboid
            $scope.user = user;
            $rootScope.isLogin = true;
            $scope.modal.hide();
        });
    }
    $scope.doRefresh = function () {
        AccountService.user(function (result) {
            if (result.status == false) {
                $ionicPopup.alert({
                    title: '提示',
                    template: result.msg
                });
            }
            $scope.user = result;
            $scope.$broadcast('scroll.refreshComplete');
        });
    }

    $scope.goDetails = function () {
        if ($rootScope.isLogin == false) {
            $scope.modal.show();
        } else {
            $state.go('tab.account-details');
            $ionicTabsDelegate.showBar(false);
        }
    }

    $scope.$on('$ionicView.beforeEnter', function () {
        console.log('已经成为活动视图');
        var user = AccountService.getCacheUser();
        if (user == undefined) {
            $rootScope.isLogin = false;
            $scope.user = {};
        } else {
            if (user.status != false) {
                $rootScope.isLogin = true;
                $scope.user = user;
            }
        }
        $ionicTabsDelegate.showBar(true);
    });

    var accountTab = $ionicTabsDelegate.$getByHandle('accountTab');
    var accountSlide = $ionicSlideBoxDelegate.$getByHandle('accountSlide');

    $scope.register = function () {
        AccountService.reg($scope.regData.account, $scope.regData.email, $scope.regData.password);
    }

    $scope.accountSelectedTab = function (index) {
        accountSlide.slide(index);
    }
    $scope.accountSlideChanged = function (index) {
        accountTab.select(accountSlide.currentIndex());
    };
})
.controller('AccountDetailsCtrl', function ($scope, $rootScope, $ionicHistory, AccountService) {
    // 注销登陆
    $scope.logout = function () {
        // 删除本地缓存
        window.localStorage.removeItem(cache.user);
        window.localStorage.removeItem(cache.token);
        $rootScope.isLogin = false;

        $ionicHistory.goBack();
    }
    $scope.user = AccountService.getCacheUser();
    $scope.doRefresh = function () {
        AccountService.user(function (user) {
            $scope.user = user;
            $rootScope.isLogin = true;
            $scope.$broadcast('scroll.refreshComplete');
        });
    }
})

说明 : 这里包含了account和accountdetails的controller。

4.完善个人中心的视图部分(view)

tab.account.html

<ion-view view-title="我">
<ion-content>
    <ion-refresher pulling-text="下拉刷新" on-refresh="doRefresh()"></ion-refresher>
    <ion-list>
        <a class="item item-avatar item-icon-right" ng-click="goDetails()">
            <img src="img/ben.png" ng-src="{{user.avatar==undefind?'':imgUrl+user.avatar}}">
            <h2><span>{{user.account==undefind?'未登陆':user.account}}</span></h2>
            <p>积分:<span>{{user.integral}}</span></p>
            <i class="icon ion-ios-arrow-right"></i>
        </a>
        <ion-item class="item-divider item-gap">
        </ion-item>
        <div class="item item-icon-right">
            <span>我的收藏</span>
            <i class="icon ion-ios-arrow-right"></i>
        </div>
        <ion-item>
            当前版本
            <span class="item-note">1.0.0</span>
            <!--<span class="item-note" ng-bind="appVersion"></span>-->
        </ion-item>
        <ion-item>
            联系作者
            <span class="item-note">微信订阅号:TongeBlog</span>
        </ion-item>
        <ion-item onclick="window.open('https://git.oschina.net/tonge/TongeNewsApp', '_blank', 'location=yes')">
            此项目已开源
        </ion-item>
        <ion-item class="text-center">
            <img src="img/TongeBlog.jpg" width="120" /><br> @TongeBlog
        </ion-item>
    </ion-list>
</ion-content>
</ion-view>

tab-account.details.html

<ion-view view-title="个人中心">
<ion-content bindonce="user">
    <ion-refresher pulling-text="下拉刷新" on-refresh="doRefresh()"></ion-refresher>
    <ion-list>
        <a class="item item-avatar" href="#">
            <img src="img/ben.png" ng-src="{{imgUrl+user.avatar}}">
            <h2><span>{{user.account}}</span></h2>
            <p>积分:<span>{{user.integral}}</span></p>
        </a>
        <ion-item>
            邮箱
            <span class="item-note">{{user.email}}</span>
        </ion-item>
        <ion-item>
            性别
            <span class="item-note">{{user.gender | toSex :user.gender}}</span>
        </ion-item>
        <ion-item>
            出生年月
            <span class="item-note">{{user.birth}}</span>
        </ion-item>
        <ion-item>
            省份
            <span class="item-note">{{user.province}}</span>
        </ion-item>
        <ion-item>
            城市
            <span class="item-note">{{user.city}}</span>
        </ion-item>
        <ion-item>
            个性签名
            <span class="item-note">{{user.signature}}</span>
        </ion-item>
        <ion-item>
            电话
            <span class="item-note">{{user.phone}}</span>
        </ion-item>
        <ion-item>
            QQ
            <span class="item-note">{{user.qq}}</span>
        </ion-item>
        <ion-item>
            微博
            <span class="item-note">{{user.weibo}}</span>
        </ion-item>
        <ion-item>
            注册时间
            <span class="item-note">{{user.time}}</span>
        </ion-item>
        <ion-item>
            <button ng-click="logout()" class="button button-full button-positive">注销
            </button>
        </ion-item>
    </ion-list>
</ion-view>

说明:这里包含了个人中心tab-account.html和个人资料页tab-account-details.html。

5. 登陆注册的视图部分(view)

<ion-modal-view title="登陆">
<div class="bar-balanced  bar bar-header item-input-inset">
    <h2 class="title">登陆</h2>
    <button class="button button-clear" ng-click="modal.hide()">关闭</button>
</div>
<ion-content class="has-header">
    <ion-slide-box class="has-header" delegate-handle="accountSlide" show-pager="false" on-slide-changed="accountSlideChanged($index)">
        <ion-slide>
            <div class="list list-inset login-hover">
                <div class="text-center">
                    <img src="img/TongeLog.png" height="38%" width="38%" />
                </div>
                <label class="item item-input">
                 <i class="ion-ios-person-outline"></i>&nbsp;&nbsp;&nbsp;
            <input type="text" ng-model="loginData.name" placeholder="账号">
        </label>
                <label class="item item-input">
                 <i class="ion-ios-locked-outline"></i>&nbsp;&nbsp;&nbsp;
            <input type="password" ng-model="loginData.password" placeholder="密码">
        </label>
                <div class="text-center">
                </div>
                <div class="item text-center">
                    <button class="button button-balanced" ng-click="login()">登陆</button>
                </div>
            </div>
        </ion-slide>
        <ion-slide>
            <div class="list list-inset login-hover">
                <div class="text-center">
                    <img src="img/TongeLog.png" height="38%" width="38%" />
                </div>
                <label class="item item-input">
                 <i class="ion-ios-person-outline"></i>&nbsp;&nbsp;&nbsp;
            <input type="text" ng-model="regData.account" placeholder="账号">
        </label>
                <label class="item item-input">
                 <i class="ion-ios-email-outline"></i>&nbsp;&nbsp;&nbsp;
            <input type="text" ng-model="regData.email" placeholder="邮箱">
        </label>
                <label class="item item-input">
                 <i class="ion-ios-locked-outline"></i>&nbsp;&nbsp;&nbsp;
            <input type="password" ng-model="regData.password" placeholder="密码">
        </label>
                <div class="text-center">
                </div>
                <div class="item text-center">
                    <button class="button button-balanced" ng-click="register()">确认注册</button>
                </div>
            </div>

        </ion-slide>
    </ion-slide-box>
</ion-content>
<ion-tabs delegate-handle="accountTab"  class="tabs-striped tabs-top">
    <ion-tab on-select="accountSelectedTab(0)" title="登陆"></ion-tab>
    <ion-tab on-select="accountSelectedTab(1)" title="注册"></ion-tab>
</ion-tabs>
</ion-modal-view>

说明:登陆注册页面放在一个.html使用slide-box里实现的。

备注:所有的代码都已开源,并上传至OSC,开源地址在订阅号中回复"开源地址"获取。

[ionic开源项目教程] - 第15讲 ionic用户个人中心登录注册的实现的更多相关文章

  1. [ionic开源项目教程] - 第14讲 ionic解决跨域问题

    [ionic开源项目教程] 第14讲 使用jsonp解决跨域问题 相信很多朋友在开发中都会遇到以下这个问题. No 'Access-Control-Allow-Origin' header is pr ...

  2. [ionic开源项目教程] - 第12讲 医疗模块的实现以及Service层loadMore和doRefresh的提取封装

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 这一讲主要实现tab2[医疗]模块,[医疗]模块跟tab1[健康]模块类似. [ionic开源项目教程] - 第12讲 医疗 ...

  3. [ionic开源项目教程] - 第11讲 封装BaseController实现controller继承

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 截止到第10讲,tab1[健康]模块的功能基本已经完成了,但这一讲中,controller层又做了较大的改动,因为下一讲中t ...

  4. [ionic开源项目教程] - 第10讲 新闻详情页的用户体验优化

    目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...

  5. [ionic开源项目教程] - 第9讲 新闻详情页的实现

    目录 [ionic开源项目教程] 第1讲 前言,技术储备,环境搭建,常用命令 [ionic开源项目教程] 第2讲 新建项目,架构页面,配置app.js和controllers.js [ionic开源项 ...

  6. [ionic开源项目教程] - 第8讲 根据菜单分类加载数据(重要)

    [ionic开源项目教程] - 第8讲  根据菜单分类加载数据(重要) [效果图] 注意 今天遇到一个比较棘手的问题,就是左右滑动菜单的设计不合理性,所以tab1.html对应的视图层和control ...

  7. [ionic开源项目教程] - 第13讲 Service层优化,提取公用Service,以及生活和农业两大模块的实现

    关注微信订阅号:TongeBlog,可查看[ionic开源项目]全套教程. 这一讲主要实现生活和农业两大模块的实现,在这个过程中,对service层提取出一个公用的BaseService. 这一讲分为 ...

  8. [ionic开源项目教程] - 第1讲 前言,技术储备,环境搭建,常用命令

    前言 这是一个系列文章,将持续更新到项目完结,从环境搭建开始讲解,包括实战开发中遇到的各种问题的解决方案,都将毫无保留的分享给大家. 技术储备 开始本项目之前,请确保自己对以下技术点都有所了解. ht ...

  9. [ionic开源项目教程] - 第2讲 新建项目,配置app.js和controllers.js搭建基础视图

    新建项目 由项目功能架构图选择合适的页面架构,这里选用Tab,ionic新建项目,默认的模板就是tab. $ ionic start TongeNews Creating Ionic app in f ...

随机推荐

  1. 三维云模拟Three.js

    http://www.mrdoob.com/#/131/clouds http://www.webgl.com/2012/03/webgl-demo-clouds/ <!DOCTYPE html ...

  2. 新浪SAE中文分词接口

    最近发现新浪SAE平台上竟然也提供分词功能,分词效果也还不错,由新浪爱问提供的分词服务,研究了一番,做了一个简易版的在线调用接口(get方式,非post) 官网说明:http://apidoc.sin ...

  3. 用C语言代码判别CPU的大小端模式

     Big-endian和little-endian是描述排列存储在计算机内存里的字节序列的术语.       Big-endian是一种大值的一端(序列中更典型值)存在前面(在最小的存储地址)的顺序. ...

  4. POJ 1491

    #include<iostream> #include<cmath> #include<iomanip> #define MAXN 50 using namespa ...

  5. java 静态构造函数

    在java中貌似是没有静态构造函数的. 不过用下面的方式同样可以实现效果. static { }//end 这是静态代码块

  6. 安装mysql之后,存入中文出现乱码

    如图显示:安装mysql之后,存入中文出现乱码 解决方案: 找到如图的文件位置 打开进行如图的修改: 结果:

  7. 转载——有感于三个50岁的美国程序员的生活状态与IT职业杂想

    明天就是国庆节了,今天也不想干活干的太累了!写一篇以前去美国出差的杂想,对比于美国50多岁的程序员和大多数50多岁国内父母的生活状态有感而发. 前几年正好有一个项目的机会出差去了一次美国,地点是美国中 ...

  8. gitHub入门指导

    Github可以托管各种git库,并提供一个web界面,但与其它像 SourceForge或Google Code这样的服务不同,GitHub的独特卖点在于从另外一个项目进行分支的简易性.为一个项目贡 ...

  9. Understanding node.js

    Node.js has generally caused two reactions in people I've introduced it to. Basically people either ...

  10. hdu 2897 邂逅明下

    转: 这个游戏和Bash game差不多,只不过是Bash game说的是每次最少取一个,最多m个,这个游戏限制在p 和q之间而已,若最后不足p个,那么就一次取完.而且该游戏要求的是最后取光的人输. ...