9 用户模块开发

本小节,我们来完成最后一个模块--用户模块的开发。

用户模块一共有5个页面,分别是登录页面,注册页面,用户操作页面,收藏职位页面以及投递记录页面,先在src/view/目录下,创建这五个页面的视图文件login.html,register.html,my.html,favorite.html,post.html。

然后给视图添加路由,打开router.js文件:

    .state(‘login‘,{
        url:‘/login‘,
        templateUrl:‘view/login.html‘,
        controller:‘loginCtrl‘
    })
    .state(‘register‘,{
        url:‘/register‘,
        templateUrl:‘view/register.html‘,
        controller:‘registerCtrl‘
    })
    .state(‘my‘,{
        url:‘/my‘,
        templateUrl:‘view/my.html‘,
        controller:‘myCtrl‘
    })
    .state(‘favorite‘,{
        url:‘/favorite‘,
        templateUrl:‘view/favorite.html‘,
        controller:‘favoriteCtrl‘
    })
    .state(‘post‘,{
        url:‘/post‘,
        templateUrl:‘view/post.html‘,
        controller:‘postCtrl‘
    });

然后给这五个页面分别创建5个controller,进入src/script/controller/目录下,新建文件loginCtrl.js,registerCtrl.js,myCtrl.js,favoriteCtrl.js,postCtrl.js,分别写入内容:

‘use strict‘;
angular.module(‘app‘)
.controller(‘loginCtrl‘,[‘$http‘, ‘$scope‘, function ($http, $scope) {

}]);

(这五个控制器的代码基本相同,只是控制器的名字不同,大家可以手动改一下,这里我只贴一个控制器的代码了)

我们先来完成登录页面,打开login.html文件:

<div class="login">
    <form class="d-b ta-c">
        <div class="form-line ta-l">
            <span class="account va-m d-ib"></span>
            <input class="d-ib" type="text" placeholder="输入手机号">
        </div>
        <div class="form-line ta-l">
            <span class="lock va-m d-ib"></span>
            <input class="d-ib" type="text" placeholder="输入密码">
        </div>
        <button class="login-btn">登录</button>
        <button class="register-btn">注册</button>
    </form>
</div>

在src/style/目录下创建login.less文件并引入index.less文件添加样式后,登录页面如下:

下面我们来开发注册静态页面,打开register.html文件:

<div class="register">
    <form class="d-b ta-c">
        <div class="form-line ta-l">
            <span class="account va-m d-ib"></span>
            <input class="d-ib" type="text" placeholder="输入手机号">
        </div>
        <div class="form-line ta-l">
            <span class="lock va-m d-ib"></span>
            <input class="d-ib" type="text" placeholder="设置6位以上的密码">
        </div>
        <div class="msgwrap ta-l">
           <input class="msgbox" type="text" placeholder="短信验证码">
            <span class="msg f-r">发送短信</span>
        </div>
        <button class="login-btn">登录</button>
        <button class="register-btn">注册</button>
    </form>
</div>

在src/style/目录下创建register.less文件并引入index.less文件添加样式后,登录页面如下:

下面我们来开发第三个页面我的操作页面,打开my.html:

<div class="my ta-c">
    <img class="d-b" src="image/head.png">
    <div class="name">小胖儿</div>
    <div class="btns">
        <button>投递</button>
        <button>收藏</button>
        <button class="logout">退出登录</button>
    </div>
</div>
<div app-foot></div>

在src/style/目录下创建my.less文件并引入index.less文件添加样式后,登录页面如下:

第四个和第五个页面,分别是投递记录和收藏页面,它俩的入口都是my.html,我们先来修改一下my.html文件:

        <button ui-sref="favorite">收藏</button>
        <button class="logout">退出登录</button>

然后进入收藏页面favorite.html:

<div app-head-bar text="我的收藏"></div>
<div app-position-list></div>

页面如下所示,暂时没有职位列表的内容:

下面是投递记录页面,打开post.html文件:

<div app-head-bar text="投递记录"></div>
<div app-tab list="tabList"></div>
<div app-position-list></div>

然后打开postCtrl.js文件,给app-tab添加数据接口:

‘use strict‘;
angular.module(‘app‘)
.controller(‘postCtrl‘,[‘$http‘, ‘$scope‘, function ($http, $scope) {
    $scope.tabList = [{
        id:‘all‘,
        name:‘全部‘
    },{
        id:‘pass‘,
        name:‘面试邀请‘
    },{
        id:‘fail‘,
        name:‘不合适‘
    }];
}]);

现在我们可以看到投递记录的页面如下所示:

现在,用户模块的五个静态页面都已经开发完了,我们开始编写用户模块的逻辑。

先写注册页面的业务逻辑,在开发这部分的逻辑之前,我们先来安装一个angular的验证表单的插件和cookie模块,打开终端,进入项目目录,执行命令:

$ bower install --save angular-validation

安装完成后会提示安装的版本号

$ bower install --save angular-cookies

安装完成后会显示版本号

将安装的插件引入到index.html文件中:

    <script src="vendor/angular-cookies/angular-cookies.min.js"></script>    <script src="vendor/angular-validation/dist/angular-validation.min.js"></script>

同时在app.js文件中,声明对validation模块的依赖:

angular.module(‘app‘,[‘ui.router‘,‘ngCookies‘, ‘validation‘]);

新建文件:cache.js在src/script/service/目录下:

‘use strict‘;
angular.module(‘app‘).service(‘cache‘, [‘$cookies‘, function($cookies){
    this.put = function(key,value){
        $cookies.put(key,value);
    };
    this.get = function(key){
        return $cookies.get(key);
    };
    this.remove = function(key){
        return $cookies.remove(key);
    };
}]);

在src/script/config/目录下创建validation.js文件用来表单校验:

‘use strict‘;
angular.module(‘app‘).config([‘$validationProvider‘, function($validationProvider){
    var expression = {
        phone:/^1[\d]{10}$/,
        password:function(value){
            var str = value+‘‘;            return str.length > 5;
        },     required:function(value){            return !!value;        }
    };
    var defaultMsg = {
        phone:{
            success:‘‘,
            error:‘必须为11位手机号‘
        },
        password:{
            success:‘‘,
            error:‘长度至少6位‘
        },     required:{            success:‘‘,            error:‘不能为空‘        }
    };
    $validationProvider.setExpression(expression).setDefaultMsg(defaultMsg);
}]);

打开register.html文件,引入我们编写好的校验逻辑:

<div class="register">
    <form class="d-b ta-c" name="form">
        <div class="form-line ta-l">
            <span class="account va-m d-ib"></span>
            <input name="phone" ng-model="user.phone" validator="required,phone" class="d-ib" type="text" placeholder="输入手机号">
        </div>
        <div class="form-line ta-l">
            <span class="lock va-m d-ib"></span>
            <input name="password" ng-model="user.password" validator="required,password" class="d-ib" type="text" placeholder="设置6位以上的密码">
        </div>
        <div class="msgwrap ta-l">
           <input name="code" validator="required" class="msgbox" type="text" placeholder="短信验证码">
            <span class="msg f-r">发送短信</span>
        </div>
        <button class="login-btn">登录</button>
        <button class="register-btn" validation-submit="form" ng-click="submit()">注册</button>
    </form>
</div>

但是我们发现,当我们在注册页面电话号码的位置输入非数字时,没有报错也没有提示信息,控制台选中表单元素,我们可以看到提示信息已经有了,放在一个span标签里:

但是我们的页面没有显示,当修改调整样式后,我们可以看到提示信息出现在了我们期望的位置如下:

当我们点击注册的时候,调用submit()函数,打开register.js文件,添加点击事件的方法:

‘use strict‘;
angular.module(‘app‘)
.controller(‘registerCtrl‘,[‘$http‘, ‘$scope‘, function ($http, $scope) {
    $scope.submit = function(){
        console.log($scope.user);
    };
}]);

这时,我们输入的手机号和密码通过验证了,点击注册,控制台会打印出电话号码和密码。

下面我们来完成验证码部分的逻辑。修改register.html代码:

<div class="msgwrap ta-l">
           <input validator="required" ng-model="user.code" class="msgbox" type="text" placeholder="短信验证码">
            <span ng-click="time?1==1:send();" ng-bind="time?time:‘发送短信‘" class="{{time?‘disabled‘:‘‘}} msg f-r"></span>
        </div>

然后打开register.js文件编写send()函数:

‘use strict‘;
angular.module(‘app‘)
.controller(‘registerCtrl‘,[‘$interval‘, ‘$http‘, ‘$scope‘, function ($interval, $http, $scope) {
    $scope.submit = function(){
        console.log($scope.user);
    };
    var count = 60;
    $scope.send = function(){
        $http.get(‘/data/code.json‘).success(function(resp){
            if(resp.state===1){
                count = 60;
                $scope.time = ‘60s‘;
                var interval = $interval(function(){
                    if(count<=0){
                        $interval.cancel(interval);
                        $scope.time =‘‘;
                        return;
                    }else{
                        count--;
                        $scope.time = count+‘s‘;
                    }
                },1000);
            }
        })
    };
}]);

这样我们就实现了,点击发送短信,变成灰色倒计时的效果了:

还要记得改一下登录按钮的跳转指向 打开register.html:

<button class="login-btn" ui-sref="login">登录</button>

下面我们要用装饰器,将一个post请求改为一个get请求,因为我们短信验证没有实际后台,所以这里我们使用这种方法,新建文件src/script/config/http.js:

‘use strict‘;
angular.module(‘app‘).config([‘$provide‘,function($provide) {
    $provide.decorator(‘$http‘, [‘$delegate‘, ‘$q‘, function($delegate, $q){
        var get = $delegate.get;
        $delegate.post = function(url, data, config){
            var def = $q.defer();
            get(url).success(function(resp){
                def.resolve(resp);
            }).error(function(){
                def.reject(resp);
            })
            return {
                success:function(cb){
                    def.promise.then(cb);
                },
                error:function(cb){
                    def.promise.then(null, cb);
                }
            }
        }
        return $delegate;
    }]);
}]);

然后打开register.js文件,修改我们的submit()函数:

‘use strict‘;
angular.module(‘app‘)
.controller(‘registerCtrl‘,[‘$interval‘, ‘$http‘, ‘$scope‘,‘$state‘, function ($interval, $http, $scope, $state) {
    $scope.submit = function(){
        //console.log($scope.user);
        $http.post(‘/data/regist.json‘, $scope.user).success(function(resp){
            // console.log(resp);
            $state.go(‘login‘);
        });
    };

现在,我们在注册页面填写注册信息后,点击注册就可以跳转到登录页面了:

注册页面的业务逻辑我们已经完成了,下面完成登录页面的逻辑。

进入登录页面模板login.html:

<div class="login">
    <form class="d-b ta-c" name="form">
        <div class="form-line ta-l">
            <span class="account va-m d-ib"></span>
            <input name="phone" validator="required,phone" ng-model="user.phone" class="d-ib" type="text" placeholder="输入手机号">
        </div>
        <div class="form-line ta-l">
            <span class="lock va-m d-ib"></span>
            <input name="password" validator="required,password" ng-model="user.password" class="d-ib" type="password" placeholder="输入密码">
        </div>
        <button class="login-btn" validation-submit="form" ng-click="submit()">登录</button>
        <button class="register-btn" ui-sref="register">注册</button>
    </form>
</div>

然后修改登录的控制器文件loginCtrl.js:

‘use strict‘;
angular.module(‘app‘)
.controller(‘loginCtrl‘,[‘cache‘, ‘$http‘, ‘$scope‘, ‘$state‘, function (cache, $http, $scope, $state) {
    $scope.submit = function(){
        $http.post(‘/data/login.json‘, $scope.user).success(function(resp){
            cache.put(‘id‘, resp.id);
            cache.put(‘name‘, resp.name);
            cache.put(‘image‘, resp.image);
            $state.go(‘main‘);
        })
    }
}]);

现在我们来修改登录后我的页面的逻辑,先修改视图代码my.html:

<div class="my ta-c">
    <div ng-if="name">
        <img class="d-b" ng-src="{{image}}">
        <div class="name" ng-bind="name"></div>
        <div class="btns">
            <button ui-sref="post">投递</button>
            <button ui-sref="favorite">收藏</button>
            <button class="logout" ng-click="logout()">退出登录</button>
        </div>
    </div>
    <div ng-hide="name" ui-sref="login">
        <button class="login-btn">去登录</button>
    </div>
</div>
<div app-foot></div>

然后修改my部分的逻辑,打开myCtrl.js文件:

‘use strict‘;
angular.module(‘app‘)
.controller(‘myCtrl‘,[‘$state‘, ‘cache‘, ‘$http‘, ‘$scope‘, function ($state, cache, $http, $scope) {
    if(cache.get(‘name‘)){
        $scope.name = cache.get(‘name‘);
        $scope.image = cache.get(‘image‘);
    };
    $scope.logout = function(){
        cache.remove(‘id‘);
        cache.remove(‘name‘);
        cache.remove(‘image‘);
        $state.go(‘main‘);
    };
}]);

我的页面退出登录的逻辑我们在上面已经完成了,现在还剩下投递和收藏两个功能,先来完成投递功能,打开post.html:

<div app-head-bar text="投递记录"></div>
<div app-tab list="tabList" tab-click="tClick(id,name)"></div>
<div app-position-list data="positionList" class="my-post" filter-obj="filterObj"></div>

然后打开post.js文件添加逻辑:

‘use strict‘;
angular.module(‘app‘)
    .controller(‘postCtrl‘, [‘$http‘, ‘$scope‘, function($http, $scope) {
        $scope.tabList = [{
            id: ‘all‘,
            name: ‘全部‘
        }, {
            id: ‘pass‘,
            name: ‘面试邀请‘
        }, {
            id: ‘fail‘,
            name: ‘不合适‘
        }];
        $http.get(‘data/myPost.json‘).success(function(resp) {
            $scope.positionList = resp;
        });
        $scope.filterObj = {};
        $scope.tClick = function(id, name) {
            switch (id) {
                case ‘all‘:
                    delete $scope.filterObj.state;
                    break;
                case ‘pass‘:
                    $scope.filterObj.state = "1";
                    break;
                case ‘fail‘:
                    $scope.filterObj.state = "-1";
                    break;
                default:
            }
        };
    }]);

现在就剩下最后一个功能啦--收藏功能,因为已经收藏的职位,我们先让收藏页面可以显示出来收藏列表,打开favorite.html文件:

<div app-head-bar text="我的收藏"></div>
<div app-position-list data="list"></div>

然后打开favoriteCtrl.js文件:

‘use strict‘;
angular.module(‘app‘)
.controller(‘favoriteCtrl‘,[‘$http‘, ‘$scope‘, function ($http, $scope) {
    $http.get(‘data/myFavorite.json‘).success(function(resp){
        $scope.list = resp;
    });
}]);

此时已经可以显示出来收藏列表了:

但是我们希望的是,在每项收藏的职位后面,都有一个五角星来显示页面的收藏选项的功能,要实现这个功能,我们需要修改职位列表页面以及其逻辑,打开positionlist.html文件:

<ul class="position-list bg-w">
    <li ui-sref="position({id:item.id})" class="item p-r" ng-repeat="item in data|filterByObj:filterObj">
        <img class="f-l logo" ng-src="{{item.imageUrl}}" alt="">
        <h3 class="title" ng-bind="item.job+‘ ‘+item.salaryName"></h3>
        <p class="text" ng-bind="item.companyName+‘(‘+item.cityName+‘)‘+item.industryName+‘ ‘+item.scaleName"></p>
        <p class="text" ng-bind="item.date"></p>
        <span ng-click="$event.stopPropagation();select(item)" ng-if="name" class="p-a icon {{item.select?‘star-active‘:‘star‘}}"></span>
        <div class="clear"></div>
    </li>
</ul>

然后打开positionlist.js文件:

‘use strict‘;
angular.module(‘app‘).directive(‘appPositionList‘,[‘cache‘,‘$http‘, function(cache, $http){
    return {
        restrict:‘A‘,
        replace:true,
        templateUrl:‘view/template/positionlist.html‘,
        scope:{
            data:‘=‘,
            filterObj:‘=‘
        },
        link:function($scope){
            $scope.name = cache.get(‘name‘) || ‘‘;
            $scope.select = function(item){
                $http.post(‘data/favorite.json‘,{
                    id:item.id,
                    select: !item.select
                }).success(function(resp){
                    item.select = !item.select;
                });
            };
        }
    };
}]);

收藏功能的逻辑已经完成:

到这里,用户模块的逻辑,我们已经完成了。

时间: 2024-10-21 21:52:36

9 用户模块开发的相关文章

2017.7.1 慕课网-Java从零打造企业级电商项目实战:用户模块设计与开发

2. 用户模块设计与开发 2.1 要实现的功能 2.2 mmall_user表 2.3 用户模块接口设计 (1)门户-用户接口 http://git.oschina.net/imooccode/happymmallwiki/wikis/%E9%97%A8%E6%88%B7_%E7%94%A8%E6%88%B7%E6%8E%A5%E5%8F%A3 (2)后台-用户接口 http://git.oschina.net/imooccode/happymmallwiki/wikis/%E5%90%8E%E

服务器架设笔记——Apache模块开发基础知识

通过上节的例子,我们发现Apache插件开发的一个门槛便是学习它自成体系的一套API.虽然Apache的官网上有对这些API的详细介绍,但是空拿着一些零散的说明书,是很难快速建立起一套可以运行的系统.(转载请指明出于breaksoftware的csdn博客) 为了实现最基础的URL解析等功能,我把<Apache模块开发指南>一书粗略了翻看了两遍,以利于迅速了解Apache模块编程的相关知识.至于书中具体的知识点,我并不在此赘述.但是为了便于大家了解之后遇到的各种相关的知识点,我大致罗列几条(摘

DNN模块开发之利器篇:七种武器

我们在进行DNN模块开发时经常需要调用Dotnetnuke.dll中的方法函数,模块开发用到DNN的方法函数会让你的开发更加得心应手,下面我们就来介绍一下. 1) PortalModuleBase 所属命名空间:DotNetNuke.Entities.Modules 这是一个开发DNN模块所必须继承的基类,标志性的基类,在此基类中,你可以得到DNN所为你封装的一些模块基本信息,毋需你多费周折,其中包括当前用户UseID,UserInfo,TabID,ModulePath,ModuleConfig

spring+springmvc+hibernate架构、maven分模块开发例子小项目案例

maven分模块开发例子小项目案例 spring+springmvc+hibernate架构 以用户管理做测试,分dao,sevices,web层,分模块开发测试!因时间关系,只测查询成功,其他的准备在ext上做个完整的案例来的,可惜最近时间很紧, 高级部分也没做测试,比如建私服,其他常用插件测试之类的,等用时间了我做个完整ext前端和maven 完整的例子出来,在分享吧! 不过目前这些撑握了,在项目中做开发是没有问题的,其他高级部分是架构师所做的. 之前我有的资源都加上了积分,有些博友向我要,

opencart 模块开发详解

opencart 模块开发详解 由 xiekanxiyang » 2013年 7月 11日 10:17 pm opencart 将页面分成若干模块, 每个模块可以有多个实例(可能这样说不是很恰当) 每个实例可以指定它出现在哪个页面 这样更好的实现了代码的可重用性,可以达到更好的页面布局的可调节性. Opencar内置了几个模块,但实际应用中我们经常要根据需要开发自己模块,现在我给大家介绍下opencart的模块开发的细节 开发步骤:首先:模块代码也分前台,后台. 后台功能是模块的安装,编辑,模块

React Native Android原生模块开发实战|教程|心得|如何创建React Native Android原生模块

尊重版权,未经授权不得转载 本文出自:贾鹏辉的技术博客(http://blog.csdn.net/fengyuzhengfan/article/details/54691503) 前言 一直想写一下我在React Native原生模块封装方面的一些经验和心得,来分享给大家,但实在抽不开身,今天看了一下日历发现马上就春节了,所以就赶在春节之前将这篇博文写好并发布(其实是两篇:要看iOS篇的点这里<React Native iOS原生模块开发>). 我平时在用React Native开发App时会

安全性登录模块开发

1.非安全性登录模块开发 安全隐患:数据明文,数据库被荡下来不安全,不能明文存储数据明文,数据库被荡下来不安全,不能明文存储明文传输,中间窃听,就关注传输过程的加密.wireshark 2.安全加固1 摘要处理:在MySQL中对数据摘要处理sql语句:sha update userinfo(表名) set password = sha(password) md5 update userinfo set password = MD5(password) 比sha短 在jsp中应用md5校验数据 i

Drupal 7 模块开发 建立模块帮助信息(hook_help)

建立模块请参考 <Drupal 7 模块开发 建立> 如果你要支持中文,文件格式必须保存为 UTF-8,NO BOM ------------------------------ hook_help 为用户提供此模块的帮助信息.我们要用自己模块名替换 hook.在这里我们建立一个 my_first_module_help 在 my_first_module.module文件里 function my_first_module_help($path, $arg) { }   参数:   $pat

ubuntu+systemtap进行Linux内核和用户空间开发测试

ubuntu+systemtap进行Linux内核和用户空间开发测试 Sailor_forever  sailing_9806#163.com (本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途.任何个人.媒体.其他网站不得私自抄袭:网络媒体转载请注明出处,增加原文链接,否则属于侵权行为.如有任何问题,请留言或者发邮件给sailing_9806#163.com) [摘要]本文主要介绍在ubuntu平台 + 自定义内核上如何安装systemtap工具包及