AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录


Posted in Javascript onJanuary 02, 2015

一、闲扯

有一天班长说了,同学们希望我开发一个可以共享位置的通讯录,于是自己简单设计了下功能。包括用户角色、发表微博、共享位置等等。这次也是有点私心的,为了锻炼最近看的angularjs,于是果断选择Node.js + MongoDB + angular.js的方案。当然,开发Node.js的体会越来越深刻。记得,去年leader告诉我说尽量让node的每一个服务只支撑一个业务功能,这样才能更方便的维护。当时特别想把一个Node服务做的特别强大。现在看来leader的做法是对的,我更加倾向于把node服务功能单一化...

二、直接上干货

数据库服务部署在阿里云;静态文件服务器采用的是Github page。

Github项目地址:https://github.com/vczero/OurTimes

线上体验地址:http://vczero.github.io/tuban/main.html#/

没图说个球啊,上图给大家看看2张截图:

(1)首页

AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录

(2)通讯录

AngularJS + Node.js + MongoDB开发的基于高德地图位置的通讯录

 ....更多去线上体验...

三、项目

总项目: https://github.com/vczero/OurTimes

开发了所需要的服务:https://github.com/vczero/OurTimes/tree/master/server

开了web pc client: https://github.com/vczero/OurTimes/tree/master/client-web

开发了简易的后台管理系统:https://github.com/vczero/OurTimes/tree/master/client-admin

欢迎大家fork ,follow和共享代码,一起构建前端而努力。

四、附上web-pc端Angular的入口文件代码

var app = angular.module('app', ['ui.router', 'ngCookies']);

var SERVER_BASE_URL = 'http://127.0.0.1:3000/';

//初始化配置

app.run(['$rootScope', function($rootScope) {

    $rootScope.appName = '图班网';

    $rootScope.desc = '基于位置的通讯录';

    $rootScope.author = '鬼谣';

    $rootScope._email = 'wlhmyit@126.com';

}]);
//调用的服务列表

app.constant('ServiceConfig', {

    wei_content: SERVER_BASE_URL + 'wei/get',

    wei_zan: SERVER_BASE_URL + 'wei/zan',

    wei_comment: SERVER_BASE_URL + 'wei/comment',

    wei_create: SERVER_BASE_URL + 'wei/create',

    user_get: SERVER_BASE_URL + 'user/get',

    user_login: SERVER_BASE_URL + 'user/login',

    user_register: SERVER_BASE_URL + 'user/register',

    user_common: SERVER_BASE_URL + 'user/getCommon',

    user_ben: SERVER_BASE_URL + 'user/getBen',

    user_self: SERVER_BASE_URL + 'user/getSelf',

    user_common_update: SERVER_BASE_URL + 'user/updateCommon',

    user_ben_update: SERVER_BASE_URL + 'user/updateBen',

    user_ben_get_name: SERVER_BASE_URL + 'user/singleBen/name',

    user_common_get_nickname: SERVER_BASE_URL + 'user/getCommon/name',

    user_ben_get_realname: SERVER_BASE_URL + 'user/singleBen/name',

    wei_get_token_page: SERVER_BASE_URL + 'wei/getByToken',

    wei_delete: SERVER_BASE_URL + 'wei/delete',

    user_update_password: SERVER_BASE_URL + 'user/updatePassword',

    article_get: SERVER_BASE_URL + 'article/get',

    article_detail: SERVER_BASE_URL + 'article/get/id',

    amap_url: 'http://webapi.amap.com/maps?v=1.3&key=ad925c5003760094713775d64748d872&callback=init'

});

//JSON parse

app.config(['$httpProvider', function($httpProvider) {

    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

    $httpProvider.defaults.headers.put['Content-Type'] = 'application/x-www-form-urlencoded;charset=utf-8';

    $httpProvider.defaults.transformRequest = [function(data) {

        var obj = [];

        for (var key in data) {

            obj.push(key + '=' + data[key]);

        }

        return obj.join('&');

    }];

}]);

//路由配置

app.config(['$stateProvider', '$urlRouterProvider', 

function($stateProvider, $urlRouterProvider) {

    /*URL路由*/

    $urlRouterProvider.otherwise("/");

    /*状态配置*/

    $stateProvider

    //首页

    .state('index', {

        url: '/',

        views: {

            '': {

                templateUrl: 'views/index/index.html',

            },

            'header@index': {

                templateUrl: 'views/header.html',

                controller: 'HeaderController'

            },

            'footer@index': {

                templateUrl: 'views/footer.html',

                controller: ''

            },

            'weibo@index': {

                templateUrl: 'views/index/weibo.html',

                controller: 'WeiboController'

            },

            'article@index': {

                templateUrl: 'views/index/article.html',

                controller: 'ArticleController'

            },

            'post@index': {

                templateUrl: 'views/index/post.html',

                controller: 'PostWeiboController'

            }

        }

    })

    .state('login', {

        url: '/login',

        views: {

            '': {

                templateUrl: 'views/login/login.html',

                controller: 'LoginController'

            }

        }

    })

    .state('register', {

        url: '/register',

        views: {

            '': {

                templateUrl: 'views/register/register.html',

                controller: 'RegisterController'

            }

        }

    })

    .state('contacts', {

        url: '/contacts',

        views: {

            '': {

                templateUrl: 'views/contacts/contacts.html',

                controller: ''

            },

            'header@contacts': {

                templateUrl: 'views/header.html',

                controller: 'HeaderController'

            },

            'userinfo@contacts': {

                templateUrl: 'views/contacts/userinfo.html',

                controller: 'UserInfoController'

            },

            'map@contacts': {

                templateUrl: 'views/contacts/map.html',

                controller: 'MapController'

            },

            'search@contacts': {

                templateUrl: 'views/contacts/search.html',

                controller: 'SearchUserController'

            }

        }

    })

    .state('ucenter', {

        url: '/ucenter',

        views: {

            '': {

                templateUrl: 'views/ucenter/ucenter.html',

                controller: ''

            },

            'header@ucenter': {

                templateUrl: 'views/header.html',

                controller: 'HeaderController'

            },

            'userWeibo@ucenter': {

                templateUrl: 'views/ucenter/weibo.html',

                controller: 'UcWeiboController'

            },

            'userDetailInfo@ucenter': {

                templateUrl: 'views/ucenter/user.html',

                controller: 'UcUserController'

            },

            'footer@ucenter': {

                templateUrl: 'views/footer.html',

                controller: ''

            }

        }

    })

    .state('article', {

        url: '/article/:id',

        views: {

            '': {

                templateUrl: 'views/article/article.html',

                controller: ''

            },

            'header@article': {

                templateUrl: 'views/header.html',

                controller: 'HeaderController'

            },

            'article_content@article': {

                templateUrl: 'views/article/article_content.html',

                controller: 'ArticleDetailController'

            },

            'footer@article': {

                templateUrl: 'views/footer.html',

                controller: ''

            }

        }

    })

    .state('article_index', {

        url: '/article',

        views: {

            '': {

                templateUrl: 'views/article/article.html',

                controller: ''

            },

            'header@article_index': {

                templateUrl: 'views/header.html',

                controller: 'HeaderController'

            },

            'article_content@article_index': {

                templateUrl: 'views/article/article_content.html',

                controller: 'ArticleDetailController'

            },

            'footer@article_index': {

                templateUrl: 'views/footer.html',

                controller: ''

            }

        }

    });
}]);
Javascript 相关文章推荐
使用 JScript 创建 .exe 或 .dll 文件的方法
Jul 13 Javascript
js切换光标示例代码
Oct 10 Javascript
jQuery操作表格(table)的常用方法、技巧汇总
Apr 12 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
Nov 25 Javascript
Bootstrap滚动监听(Scrollspy)插件详解
Apr 26 Javascript
jQuery layui常用方法介绍
Jul 25 Javascript
深入解析js轮播插件核心代码的实现过程
Apr 14 Javascript
JS实现延迟隐藏功能的方法(类似QQ头像鼠标放上展示信息)
Dec 28 Javascript
VUE中使用MUI方法
Feb 12 Javascript
angular4应用中输入的最小值和最大值的方法
May 17 Javascript
webpack4 配置 ssr 环境遇到“document is not defined”
Oct 24 Javascript
vue 中url 链接左边的小图标更改问题
Dec 30 Javascript
javascript制作的cookie封装及使用指南
Jan 02 #Javascript
分享一则javascript 调试技巧
Jan 02 #Javascript
javascript实现无限级select联动菜单
Jan 02 #Javascript
javascript实现表格排序 编辑 拖拽 缩放
Jan 02 #Javascript
原生javascript实现DIV拖拽并计算重复面积
Jan 02 #Javascript
javascript使用smipleChart实现简单图表
Jan 02 #Javascript
原生javascript实现简单的datagrid数据表格
Jan 02 #Javascript
You might like
php错误、异常处理机制(补充)
2012/05/07 PHP
php冒泡排序、快速排序、快速查找、二维数组去重实例分享
2014/04/24 PHP
CodeIgniter配置之config.php用法实例分析
2016/01/19 PHP
实例讲解php实现多线程
2019/01/27 PHP
PHP获取访问设备信息的方法示例
2019/02/20 PHP
php面向对象程序设计入门教程
2019/06/22 PHP
利用js获取服务器时间的两个简单方法
2010/01/08 Javascript
javascript检测是否联网的实现代码
2014/09/28 Javascript
原生js实现验证码功能
2017/03/16 Javascript
详解react如何在组件中获取路由参数
2017/06/15 Javascript
JavaScript hasOwnProperty() 函数实例详解
2017/08/04 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
Vue2.5通过json文件读取数据的方法
2018/02/27 Javascript
解决使用bootstrap的dropdown部件时报错:error:Bootstrap dropdown require Popper.js问题
2018/08/30 Javascript
在 Vue 应用中使用 Netlify 表单功能的方法详解
2019/06/03 Javascript
javascript实现简易聊天室
2019/07/12 Javascript
原生js实现自定义滚动条组件
2021/01/20 Javascript
[01:04]DOTA2上海特锦赛现场采访 FreeAgain遭众解说围攻
2016/03/25 DOTA
python实现apahce网站日志分析示例
2014/04/02 Python
python通过字典dict判断指定键值是否存在的方法
2015/03/21 Python
python实现上传下载文件功能
2020/11/19 Python
python实现验证码识别功能
2018/06/07 Python
Python中函数参数调用方式分析
2018/08/09 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
Python批量删除只保留最近几天table的代码实例
2019/04/01 Python
python实现通过flask和前端进行数据收发
2019/08/22 Python
Python如何根据时间序列数据作图
2020/05/12 Python
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
下面代码从性能上考虑,有什么问题
2015/04/03 面试题
创先争优活动党员公开承诺书
2014/08/29 职场文书
2015年建党94周年演讲稿
2015/03/19 职场文书
环保建议书作文300字
2015/09/14 职场文书
技术转让协议书
2016/03/19 职场文书
聊聊golang中多个defer的执行顺序
2021/05/08 Golang