├── .editorconfig ├── .gitattributes ├── .gitignore ├── .jshintrc ├── .travis.yml ├── .yo-rc.json ├── README.md ├── app ├── index.js └── templates │ ├── .DS_Store │ ├── README.md │ ├── _Gruntfile.js │ ├── _bower.json │ ├── _package.json │ ├── _travis.yml │ ├── app │ ├── .DS_Store │ ├── index.html │ ├── scripts │ │ ├── .DS_Store │ │ ├── _build.js │ │ ├── app.js │ │ ├── bootstrap.js │ │ ├── cons │ │ │ └── simpleCons.js │ │ ├── controllers │ │ │ ├── _base.js │ │ │ ├── controllers.js │ │ │ └── homeController.js │ │ ├── directives │ │ │ ├── _base.js │ │ │ ├── directives.js │ │ │ └── simpleGrid.js │ │ ├── filters │ │ │ ├── _base.js │ │ │ └── filters.js │ │ ├── main.js │ │ ├── main.min.js │ │ ├── services │ │ │ ├── _base.js │ │ │ └── services.js │ │ ├── states │ │ │ ├── _base.js │ │ │ ├── home.js │ │ │ └── states.js │ │ └── views │ │ │ ├── .DS_Store │ │ │ ├── home.html │ │ │ └── view1.html │ └── styles │ │ ├── app.scss │ │ └── bootstrap │ │ └── bootstrap.css │ ├── bowerrc │ ├── editorconfig │ ├── gitattributes │ ├── gitignore │ ├── gruntSetting.json │ ├── grunt_server │ └── index.js │ ├── jshintrc │ ├── test-creation.js │ ├── test-load.js │ └── tests │ └── home │ ├── home.json │ └── postData.json ├── controllers ├── .DS_Store ├── index.js └── templates │ ├── .DS_Store │ ├── _controller.js │ └── _subController.js ├── npm-debug.log ├── package.json ├── routes ├── index.js └── templates │ └── _state.js ├── test ├── test-app.js ├── test-controller.js ├── test-routes.js ├── test-services.js └── test-views.js └── views ├── .DS_Store ├── index.js └── templates ├── .DS_Store ├── _subView.js └── _view.js /.editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "esnext": true, 4 | "bitwise": true, 5 | "camelcase": true, 6 | "curly": true, 7 | "eqeqeq": true, 8 | "immed": true, 9 | "indent": 2, 10 | "latedef": true, 11 | "newcap": true, 12 | "noarg": true, 13 | "quotmark": "single", 14 | "regexp": true, 15 | "undef": true, 16 | "unused": true, 17 | "strict": true, 18 | "trailing": true, 19 | "smarttabs": true, 20 | "white": true 21 | } 22 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | before_install: 5 | - currentfolder=${PWD##*/} 6 | - if [ "$currentfolder" != 'generator-webbp' ]; then cd .. && eval "mv $currentfolder generator-webbp" && cd generator-webbp; fi 7 | 8 | -------------------------------------------------------------------------------- /.yo-rc.json: -------------------------------------------------------------------------------- 1 | { 2 | "generator-generator": {} 3 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # generator-webbp [![Build Status](https://secure.travis-ci.org/cc17/generator-webbp.png?branch=master)](https://travis-ci.org/cc17/generator-webbp) 2 | 3 | > [Yeoman](http://yeoman.io) generator 4 | 5 | 6 | ## Getting Started 7 | 8 | ```bash 9 | npm install -g yo 10 | ``` 11 | 12 | ### Yeoman Generators 13 | 14 | Yeoman travels light. He didn't pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension. 15 | 16 | To install generator-webbp from npm, run: 17 | 18 | ```bash 19 | npm install -g generator-webbp 20 | ``` 21 | 22 | Finally, initiate the generator: 23 | 24 | ```bash 25 | yo webbp 26 | ``` 27 | 28 | ## 子命令 29 | 30 | * 单步生成controller 31 | 32 | ```js 33 | yo webbp:controllers detail.about.contact 34 | ``` 35 | 亮点:可以嵌套,此命令会生成如下文件 36 | ```bash 37 | |controllers 38 | |detail 39 | |about.js 40 | |contact.js 41 | detail.js 42 | ``` 43 | 另外detail.js中会自动加载about.js及contact.js 44 | 45 | * 单步生成views 46 | 47 | ```js 48 | yo webbp:views detail.about.contact 49 | ``` 50 | 亮点:可以嵌套,此命令会生成如下文件 51 | ```bash 52 | |views 53 | |detail 54 | |about.html 55 | |contact.html 56 | detail.html 57 | ``` 58 | * 单步生成routes 59 | 60 | ```js 61 | yo webbp:routess detail.about.contact 62 | ``` 63 | 亮点:可以嵌套,此命令会生成如下文件 64 | ```bash 65 | |states 66 | |detail.js 67 | ``` 68 | 其内容是: 69 | ```js 70 | define(['./states', '../cons/simpleCons'], 71 | function (stateModule, simpleCons) { 72 | stateModule.config( 73 | ['$stateProvider', '$urlRouterProvider', 74 | function ($stateProvider, $urlRouterProvider) { 75 | $stateProvider.state("detail", { 76 | abstract: true, 77 | resolve: { 78 | instanceBasicPromise: [ '$stateParams', function( $stateParams){ 79 | 80 | }] 81 | }, 82 | url: "/detail", 83 | controller: 'detailController', 84 | templateUrl: simpleCons.VIEW_PATH + 'detail.html' 85 | }) 86 | 87 | .state("detail.about", { 88 | url: "/about", 89 | views: { 90 | detail: { 91 | templateUrl: simpleCons.VIEW_PATH + 'detail/about.html', 92 | controller: 'detail.aboutController' 93 | } 94 | } 95 | }) 96 | 97 | } 98 | ]); 99 | }) 100 | ``` 101 | 亮点:通过运行此命令,会自动生成 routes(用的是ui-router,目录是states目录),view,controller。有没有觉得很爽的感觉。 102 | 103 | 104 | 105 | 106 | ## License 107 | 108 | MIT 109 | -------------------------------------------------------------------------------- /app/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var util = require('util'); 3 | var path = require('path'); 4 | var yeoman = require('yeoman-generator'); 5 | var yosay = require('yosay'); 6 | 7 | var WebbpGenerator = yeoman.generators.Base.extend({ 8 | initializing: function () { 9 | this.pkg = require('../package.json'); 10 | 11 | 12 | this.on('end', function () { 13 | if(this.installDeps == true) { 14 | this.installDependencies(); 15 | } 16 | 17 | console.log('install dep ready...') 18 | }); 19 | 20 | }, 21 | prompting: function () { 22 | var done = this.async(); 23 | 24 | // Have Yeoman greet the user. 25 | this.log(yosay( 26 | 'Welcome to the breathtaking Webbp generator!' 27 | )); 28 | 29 | var prompts = [ 30 | { 31 | name:'project_name', 32 | message:"enter the name of your project", 33 | default:'webapp' 34 | }, 35 | { 36 | type: 'confirm', 37 | name:'installDeps', 38 | message:"Would you like to install the node.js dependencies, it maybe a little slow to do that?", 39 | default:false 40 | } 41 | ]; 42 | 43 | this.prompt(prompts,function(answers){ 44 | this.project_name = answers.project_name; 45 | done(); 46 | }.bind(this) ); 47 | 48 | }, 49 | createAppDirector:function(){ 50 | var dir = [ 51 | 'app', 52 | 'app/scripts', 53 | 'app/scripts/cons', 54 | 'app/scripts/controllers', 55 | 'app/scripts/directives', 56 | 'app/scripts/filters', 57 | 'app/scripts/partials', 58 | 'app/scripts/services', 59 | 'app/scripts/states', 60 | 'app/scripts/utils', 61 | 'app/scripts/views', 62 | 'app/vendor', 63 | 'app/styles', 64 | 'app/styles/images' 65 | ]; 66 | dir.forEach(function(item){ 67 | this.mkdir(this.project_name + '/' + item); 68 | }.bind(this)); 69 | }, 70 | copyServerAndConfig:function(){ 71 | var dir = [ 72 | 'grunt_server', 73 | 'app', 74 | 'tests' 75 | ]; 76 | dir.forEach(function(item){ 77 | this.directory(item,this.project_name + '/' + item); 78 | }.bind(this)); 79 | }, 80 | copyFile:function(){ 81 | this.copy('jshintrc',this.project_name + '/' + '.jshintrc'); 82 | this.copy('gitignore',this.project_name + '/' + '.gitignore'); 83 | this.copy('bowerrc',this.project_name + '/' + '.bowerrc'); 84 | this.template('_bower.json',this.project_name + '/bower.json') 85 | this.template('./app/scripts/_build.js',this.project_name + '/app/scripts/' + this.project_name + 'ForBuild.js'); 86 | }, 87 | gruntfile:function(){ 88 | this.copy('gruntSetting.json',this.project_name + '/gruntSetting.json'); 89 | this.template('_Gruntfile.js',this.project_name + '/Gruntfile.js'); 90 | }, 91 | packageJSON:function(){ 92 | this.template('_package.json',this.project_name + '/package.json'); 93 | } 94 | }); 95 | 96 | module.exports = WebbpGenerator; 97 | -------------------------------------------------------------------------------- /app/templates/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/app/templates/.DS_Store -------------------------------------------------------------------------------- /app/templates/README.md: -------------------------------------------------------------------------------- 1 | # generator-webbp [![Build Status](https://secure.travis-ci.org/cc17/generator-webbp.png?branch=master)](https://travis-ci.org/cc17/generator-webbp) 2 | 3 | > [Yeoman](http://yeoman.io) generator 4 | 5 | 6 | ## Getting Started 7 | 8 | ```bash 9 | npm install -g yo 10 | ``` 11 | 12 | ### Yeoman Generators 13 | 14 | Yeoman travels light. He didn't pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension. 15 | 16 | To install generator-webbp from npm, run: 17 | 18 | ```bash 19 | npm install -g generator-webbp 20 | ``` 21 | 22 | Finally, initiate the generator: 23 | 24 | ##生成器部分介绍: 25 | 26 | ### 基本命令 27 | ```bash 28 | yo webbp 29 | ``` 30 | 31 | ### 子命令 32 | 33 | * 单步生成controller 34 | 35 | ```js 36 | yo webbp:controllers detail.about.contact 37 | ``` 38 | 亮点:可以嵌套,此命令会生成如下文件 39 | ```bash 40 | |controllers 41 | |detail 42 | |about.js 43 | |contact.js 44 | detail.js 45 | ``` 46 | 另外detail.js中会自动加载about.js及contact.js 47 | 48 | * 单步生成views 49 | 50 | ```js 51 | yo webbp:views detail.about.contact 52 | ``` 53 | 亮点:可以嵌套,此命令会生成如下文件 54 | ```bash 55 | |views 56 | |detail 57 | |about.html 58 | |contact.html 59 | detail.html 60 | ``` 61 | * 单步生成routes 62 | 63 | ```js 64 | yo webbp:routess detail.about.contact 65 | ``` 66 | 亮点:可以嵌套,此命令会生成如下文件 67 | ```bash 68 | |states 69 | |detail.js 70 | ``` 71 | 其内容是: 72 | ```js 73 | define(['./states', '../cons/simpleCons'], 74 | function (stateModule, simpleCons) { 75 | stateModule.config( 76 | ['$stateProvider', '$urlRouterProvider', 77 | function ($stateProvider, $urlRouterProvider) { 78 | $stateProvider.state("detail", { 79 | abstract: true, 80 | resolve: { 81 | instanceBasicPromise: [ '$stateParams', function( $stateParams){ 82 | 83 | }] 84 | }, 85 | url: "/detail", 86 | controller: 'detailController', 87 | templateUrl: simpleCons.VIEW_PATH + 'detail.html' 88 | }) 89 | 90 | .state("detail.about", { 91 | url: "/about", 92 | views: { 93 | detail: { 94 | templateUrl: simpleCons.VIEW_PATH + 'detail/about.html', 95 | controller: 'detail.aboutController' 96 | } 97 | } 98 | }) 99 | 100 | } 101 | ]); 102 | }) 103 | ``` 104 | 亮点:通过运行此命令,会自动生成 routes(用的是ui-router,目录是states目录),view,controller。有没有觉得很爽的感觉。 105 | 106 | 107 | ## mock数据部分 108 | 109 | 根据yo命令生成项目之后,npm install安装node模块,之后grunt 。 即可自动在浏览器打开项目页面(因为模板中默认是用sass,compass编译css,如果出现错误,请自行检车是否能正确编译scss) 110 | 111 | 1.mock数据放在tests目录下,可以自行建立目录及 json文件。 112 | 2.在项目 app/scripts/services 中可以用 http服务调用 tests目录下的json文件, 可支持get及post请求 113 | 114 | 115 | ## css编译部分 116 | 117 | css采用的是 scss,compass编译。可支持嵌套及变量写法,还可以支持多浏览器的前缀自动编译,具体参看compass文档。 118 | 119 | 120 | ## License 121 | 122 | MIT -------------------------------------------------------------------------------- /app/templates/_Gruntfile.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 自动化脚本定义 3 | */ 4 | module.exports = function (grunt) { 5 | 'use strict'; 6 | 7 | var cfg = { 8 | livereload:35729, 9 | serverPort:3001, 10 | serverHost:'0.0.0.0' 11 | }; 12 | 13 | //load all grunt tasks 14 | require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); 15 | grunt.initConfig({ 16 | cfg:cfg, 17 | pkg:grunt.file.readJSON('package.json'), 18 | connect: { 19 | options: { 20 | port: cfg.serverPort, 21 | hostname: cfg.serverHost, 22 | base:'.' 23 | }, 24 | dev: { 25 | options: { 26 | middleware: function (connect) { 27 | return [ 28 | require('connect-livereload')({port: cfg.livereload}), 29 | require('./grunt_server')('.tmp') 30 | ]; 31 | } 32 | } 33 | }, 34 | dist: { 35 | options: { 36 | middleware: function (connect) { 37 | //globalSetting.activeFolder = globalSetting.buildFolder; 38 | return [ 39 | require('./grunt_server')('build') 40 | ]; 41 | } 42 | } 43 | } 44 | }, 45 | copy: { 46 | debug: { 47 | files: [ 48 | { 49 | expand: true, 50 | cwd: 'app', 51 | src: ['**/*.{css,js,png,jpg,gif,jpeg,html,svg,eot,ttf,woff,json,htm}'], 52 | dest: '.tmp' 53 | } 54 | ] 55 | }, 56 | dist: { 57 | files: [ 58 | { 59 | expand: true, 60 | cwd: 'app', 61 | src: ['**/*.{css,js,png,jpg,gif,jpeg,html,svg,eot,ttf,woff,json,htm}'], 62 | dest: 'build' 63 | } 64 | ] 65 | } 66 | }, 67 | html2js: { 68 | options: { 69 | htmlmin: { 70 | collapseWhitespace: true 71 | }, 72 | useStrict: true, 73 | module: 'app.tpl', 74 | rename: function (moduleName) { 75 | console.log(moduleName,'moduleName'); 76 | var newName = moduleName.replace('../', ''); 77 | return newName; 78 | } 79 | }, 80 | compileTpl: { 81 | src: [ 82 | 'app/scripts/partials/**/*.html', 83 | 'app/scripts/views/**/*.html' 84 | ], 85 | dest: 'app/scripts/app-tpl.js' 86 | } 87 | }, 88 | 89 | watch: { 90 | options: { 91 | livereload: true 92 | }, 93 | message: { 94 | files: ['app/scripts/drds/nls/src/*.js'], 95 | tasks: ['message'] 96 | }, 97 | scripts: { 98 | files: ['app/scripts/**/*.{js,css,png,jpg,jpeg,webp,gif,map}', 99 | 'app/style/**/*.{css,png,jpg,jpeg,webp,gif,map,woff,ttf,svg}'], 100 | tasks: ['copy:debug'] 101 | }, 102 | compass: { 103 | files: ['app/**/*.{scss,sass}'], 104 | tasks: ['compass:dev'] 105 | }, 106 | // jade: { 107 | // files: ['app/**/*.jade'], 108 | // tasks: ['jade:debug'] 109 | // }, 110 | html: { 111 | files: ['app/**/*.html'], 112 | tasks: ['copy:debug'] 113 | }, 114 | // coffee: { 115 | // files: ['app/scripts/{,*/}*.coffee'], 116 | // tasks: ['coffee:debug'] 117 | // }, 118 | html2js: { 119 | files: [ 'app/scripts/*/views/**/*.html', 120 | 'app/scripts/*/partials/**/*.html'], 121 | tasks: ['html2js:compileTpl'] 122 | } 123 | }, 124 | compass: { // Task 125 | dist: { // Target 126 | options: { // Target options 127 | sassDir: 'app/styles/', 128 | cssDir: 'build/', 129 | environment: 'production' 130 | } 131 | }, 132 | dev: { // Another target 133 | options: { 134 | sassDir: 'app/', 135 | cssDir: '.tmp/' 136 | } 137 | } 138 | }, 139 | requirejs: { 140 | options: { 141 | //optimize: 'none' 142 | }, 143 | debug:{ 144 | options: { 145 | optimize:'none', 146 | baseUrl: "app/scripts", 147 | mainConfigFile: "app/scripts/main.js", 148 | name: "bootstrap", // assumes a production build using almond 149 | out: ".tmp/scripts/main.min.js" 150 | } 151 | }, 152 | dist:{ 153 | options: { 154 | baseUrl: "app/scripts", 155 | mainConfigFile: "app/scripts/main.js", 156 | name: "bootstrap", // assumes a production build using almond 157 | out: "build/scripts/main.min.js" 158 | } 159 | } 160 | }, 161 | open:{ 162 | dev:{ 163 | url:'http://localhost:' + cfg.serverPort 164 | } 165 | } 166 | }); 167 | grunt.registerTask('default',[ 168 | 'connect:dev', 169 | 'html2js:compileTpl', 170 | 'copy:debug', 171 | 'compass:dev', 172 | //'requirejs:debug', 173 | 'open:dev', 174 | 'watch' 175 | ]); 176 | grunt.registerTask('build',[ 177 | 'html2js:compileTpl', 178 | 'compass:dev', 179 | 'copy:dist', 180 | 'requirejs:dist', 181 | 'connect:dist:keepalive' 182 | ]); 183 | 184 | }; -------------------------------------------------------------------------------- /app/templates/_bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "<%= project_name%>", 3 | "version": "0.1.0", 4 | "dependencies": { 5 | "jquery": "1.10.2", 6 | "angular": "1.2.2", 7 | "angular-route": "1.2.2", 8 | "angular-resource": "1.2.2", 9 | "angular-cookies": "1.2.2", 10 | "angular-sanitize": "1.2.2", 11 | "angular-ui": "", 12 | "angular-ui-router": "0.2.7", 13 | "angular-bootstrap": "~0.10.0", 14 | "html5shiv": "~3.6.2", 15 | "requirejs": "~2.1.9", 16 | "highcharts": "4.0.4", 17 | "respond": "1.4.1", 18 | "angular-loading-bar": "~0.2.0", 19 | "angular-base64": "~2.0.1", 20 | "spinjs": "~1.3.3", 21 | "angular-ui-select2":"~0.0.5", 22 | "select2":"~3.4.5", 23 | "angular-ui-codemirror": "~0.1.1", 24 | "ngInfiniteScroll":"~1.1.2", 25 | "angular-bindonce":"0.3.1", 26 | "simple-form":"*" 27 | }, 28 | "devDependencies": { 29 | "angular-bindonce": "~0.3.1", 30 | "zeroclipboard": "~1.3.3" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/templates/_package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "<%=project_name%>", 3 | "version": "0.1.0", 4 | "dependencies": {}, 5 | "devDependencies": { 6 | "grunt": "~0.4.1", 7 | "grunt-contrib-copy": "~0.4.0", 8 | "grunt-contrib-concat": "~0.1.2", 9 | "grunt-contrib-uglify": "~0.2.0", 10 | "grunt-contrib-compass": "~0.2.0", 11 | "grunt-contrib-jshint": "~0.4.3", 12 | "grunt-contrib-connect": "0.3.0", 13 | "grunt-contrib-clean": "0.4.0", 14 | "grunt-contrib-imagemin": "0.1.2", 15 | "grunt-contrib-jade": "0.5.0", 16 | "grunt-contrib-requirejs": "~0.4.1", 17 | "grunt-usemin": "~0.1.9", 18 | "grunt-contrib-watch": "~0.5.3", 19 | "grunt-open": "~0.2.0", 20 | "matchdep": "~0.1.1", 21 | "connect-livereload": "~0.3.0", 22 | "bower": "~1.2.8", 23 | "express": "~3.4.7", 24 | "grunt-contrib-coffee": "~0.8.0", 25 | "grunt-html2js": "~0.2.3", 26 | "morgan":"~1.3.1" 27 | }, 28 | "engines": { 29 | "node": ">=0.8.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/templates/_travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: 3 | - '0.10' 4 | before_install: 5 | - currentfolder=<%= "${PWD##*/}" %> 6 | - if [ "$currentfolder" != '<%= _.slugify(appname) %>' ]; then cd .. && eval "mv $currentfolder <%= _.slugify(appname) %>" && cd <%= _.slugify(appname) %>; fi 7 | 8 | -------------------------------------------------------------------------------- /app/templates/app/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/app/templates/app/.DS_Store -------------------------------------------------------------------------------- /app/templates/app/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Examples 7 | 8 | 9 | 10 | 11 | 12 | 13 | 23 | 31 |
32 | 33 | 34 | 35 | 36 | 39 | 40 | -------------------------------------------------------------------------------- /app/templates/app/scripts/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/app/templates/app/scripts/.DS_Store -------------------------------------------------------------------------------- /app/templates/app/scripts/_build.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/app/templates/app/scripts/_build.js -------------------------------------------------------------------------------- /app/templates/app/scripts/app.js: -------------------------------------------------------------------------------- 1 | define([ 2 | 'angular', 3 | 'ui.router', 4 | './controllers/_base', 5 | './states/_base', 6 | './directives/_base', 7 | './filters/_base', 8 | './services/_base', 9 | './app-tpl' 10 | ],function(){ 11 | return angular.module('<%=project_name%>App',[ 12 | 'ui.router', 13 | 'app.tpl', 14 | 'app.<%=project_name%>Controllers', 15 | 'app.<%=project_name%>States', 16 | 'app.<%=project_name%>Directives', 17 | 'app.<%=project_name%>Filters', 18 | 'app.<%=project_name%>Services' 19 | ]); 20 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/bootstrap.js: -------------------------------------------------------------------------------- 1 | define([ 2 | 'angular', 3 | 'app' 4 | ],function(angular){ 5 | angular.element(document).ready(function(){ 6 | angular.bootstrap(document, ['<%= project_name%>App']); 7 | }); 8 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/cons/simpleCons.js: -------------------------------------------------------------------------------- 1 | define([],function(){ 2 | return { 3 | 'VIEW_PATH':'scripts/views/', 4 | 'PARTIALS_PATH':'scripts/partials/' 5 | }; 6 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/controllers/_base.js: -------------------------------------------------------------------------------- 1 | define(['./controllers','./homeController'],function(){ 2 | 3 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/controllers/controllers.js: -------------------------------------------------------------------------------- 1 | define(['angular'], function (angular) { 2 | return angular.module('app.<%= project_name %>Controllers', []); 3 | }); 4 | -------------------------------------------------------------------------------- /app/templates/app/scripts/controllers/homeController.js: -------------------------------------------------------------------------------- 1 | define(['./controllers'],function(mod){ 2 | mod 3 | .controller('homeController',homeControl) 4 | .controller('view1Controller',view1Control); 5 | 6 | function homeControl($scope,$http){ 7 | $scope.message = 'Hello'; 8 | $http.get('home/home.json').then(function(res){ 9 | console.log(res); 10 | }); 11 | 12 | $http({ 13 | url:'home/postData.json', 14 | method:'post', 15 | params:{ 16 | key:'test' 17 | } 18 | }).then(function(res){ 19 | console.log(res); 20 | }); 21 | 22 | }; 23 | homeControl.$inject = ['$scope','$http']; 24 | 25 | function view1Control($scope){ 26 | $scope.message = 'view1'; 27 | }; 28 | view1Control.$inject = ['$scope']; 29 | 30 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/directives/_base.js: -------------------------------------------------------------------------------- 1 | define(['./directives'],function(){ 2 | 3 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/directives/directives.js: -------------------------------------------------------------------------------- 1 | define(['angular'], function (angular) { 2 | return angular.module('app.<%= project_name %>Directives', []); 3 | }); 4 | -------------------------------------------------------------------------------- /app/templates/app/scripts/directives/simpleGrid.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 3 | var tableMedaDef = { 4 | columns: [ 5 | { 6 | name: 'theadName', // 表头要显示的名字。@required。table header name property 7 | field: 'field', // 表头对应的field。field to iterator, generator dependency on rowItemName. 8 | cssProperty: '', // 对该列的自定义css。css property setting. 9 | // @breakall: If the text in field is very long, should add breakall make sure it can break to multi line 10 | // @text-right: for operation field we should use right align 11 | htmlField: false, //如果是html的内容将自动采用html格式文本 if field is html, set the proeprty to true, use bo-html or bind-html. 12 | filter: '', // angular 过滤器。 formatter function for field. 13 | truncateText: false, //文字是否要截断。 if field is true, it will auto add the aliyun-truncate-text directive. 14 | truncateTextLength: 20, // 如果文字需要截断默认的长度为12。if truncateText is set to true, need this property to specify the max length to show ... 15 | fieldDirective: '', // 将采用directive来渲染单元格。need special directive for the field. If this property is setting, @filed @htmlField @truncate 16 | // will not work. depend on rowItemName 17 | bindable: false // 如果属性设置为true,则强制使用bindable。 18 | } 19 | ], 20 | useBindOnce: false, // 默认为false,true 将使用bindonce。bindOnce true the bind once will be supported to optiomize the performance and reduce the binding. 21 | paginationSupport: false, // 默认为false, ture将启用分页组件。if true pagination bar will be added. 22 | searchSupport: false, // 默认为false,true将启用搜索工具栏。if true the search bar will be added to dom object. 23 | checkboxSupport: false, // 默认false,true将启用首列为checkbox。if the proeperty is true, the first column will set as checkbox. 24 | filterItems: [], // 按照column的field来指定表头过滤。支持格式如下{"region":[{"id":"all","text":"全部"},{"id":"Prepaid","text":"包年包月"},{"id":"AfterPay","text":"按量"}],"region2":[{"id":"all","text":"全部"},{"id":"Prepaid","text":"包年包月"},{"id":"AfterPay","text":"按量"}]} 25 | preSelectionFilter: {}, //支持默认选择过滤条件。 {region: 'Prepaid'} 26 | searchItems: [], // 如果搜索启用。指定搜索范围和placeholder。 [{"value":"deviceName","text":"磁盘名称","placeholder":"请输入磁盘名称进行模糊查询"},{"value":"deviceNo","text":"磁盘ID","placeholder":"请输入磁盘ID进行精确查询"}] 27 | preSelectionSearch: {}, // 如果搜索启用,搜索范围确定,可以采用默认的搜索选择第N项以某搜索条件开始。 {key: 'deviceNo',value: 'testinfo'} 28 | selectedProperty: 'selected', //属性名以标示当然的row是否被选中。默认为selected。every row selected identifier, default value is 'selected' 29 | selectedScopeProperty: 'selectedItems', //默认放在scope上的属性,用来标示当前选中的rows, default value is 'selectedItems' 30 | batchOperationBarDirective: '', // 批量操作控件。例如
31 | rowItemName: 'item' //ng-repeat 提供的每行的标示。默认为item。 the iterator name for ng-repeat. which will be helpful while you specify the for iterator 32 | checkboxDisabledProperty: 'noneSelected' //如果属性为true,将这一行的属性的checkbox为disabled。 33 | }]} 34 | 35 | sample usage: 36 | $scope.updateTableData = function(params){ 37 | updateHomeView({ 38 | params: params.params 39 | }, !params.isInitTableRequest) 40 | } 41 | 42 | $scope.columns = [ 43 | {name: '实例ID/名称', field: 'vpcInstanceId'}, 44 | {name: '状态', field: 'vpcInstanceStatus', filter: 'vpcInstanceStatusFilter'}, 45 | {name: '已用缓存及配额', field: 'memUsed'}, 46 | {name: '区域', field: 'region', filterOptionKey: 'region'}, 47 | {name: '创建时间', field: 'gmtCreated', filterOptionKey: 'region2'}, 48 | {name: '操作', cssProperty: 'text-right', fieldDirective: '
'} 49 | ] 50 | 51 | $scope.config = { 52 | clientSort: false // false. if the property is true, grid can support client sort. 53 | // If the column also with filter support, it will not support browser sort anymore. 54 | useBindOnce: true, // true the bind once will be supported to optiomize the performance and reduce the binding. 55 | paginationSupport: true, // if true pagination bar will be added. 56 | searchSupport: false, // if true the search bar will be added to dom object. 57 | checkboxSupport: false, // if the property is true, the first column will set as checkbox. 58 | rowItemName: 'vpcItem', // the iterator name for ng-repeat. which will be helpful while you specify the for ng-repeat 59 | filterItems: { 60 | region: [ 61 | {id:'all',text:'全部'}, 62 | {id:'Prepaid',text:'包年包月'}, 63 | {id:'AfterPay',text:'按量'} 64 | ], 65 | region2: [ 66 | {id:'all',text:'全部'}, 67 | {id:'Prepaid',text:'包年包月'}, 68 | {id:'AfterPay',text:'按量'} 69 | ] 70 | }, 71 | preSelectionFilter: { 72 | region: 'Prepaid' 73 | }, 74 | searchItems: [ 75 | {value:'deviceName',text:'磁盘名称',placeholder:'请输入磁盘名称进行模糊查询'}, 76 | {value:'deviceNo',text:'磁盘ID',placeholder:'请输入磁盘ID进行精确查询'}, 77 | {value:'instanceId',text:'实例ID',placeholder:'请输入实例ID进行精确查询'}, 78 | {value:'instanceName',text:'实例名称',placeholder:'请输入实例名称进行模糊查询',type:'date'} 79 | ], 80 | preSelectionSearch: { 81 | key: 'deviceNo', 82 | value: 'testinfo' 83 | }, 84 | paginationInfo: { 85 | pageSize: 10, 86 | page: 1, 87 | maxSize:5, //最大展示页,默认3 88 | showPageGoto: false //属性为true将显示前往第几页。 89 | } 90 | } 91 | */ 92 | define(['./aliyunCommonDirectives', 'angular', './aliyunConsolePagination', 'bindonce', './loading', 93 | './searchBar', './tableSearch', './noneDataInfo'], 94 | function (directiveModule, angular) { 95 | 96 | function buildSearchBar(config, element){ 97 | if(config.searchSupport){ 98 | var preSelectionSearch = ''; 99 | if(config.preSelectionSearch){ 100 | preSelectionSearch = ' pre-selection="{{searchParams}}"'; 101 | } 102 | var searchHtml = '
'; 105 | element.find('.searchSection').html(searchHtml) 106 | } 107 | } 108 | 109 | function buildTable(columns, config){ 110 | var header = buildHeader(columns, config); 111 | var rowDef = buildRows(columns, config); 112 | var tfoot = buildTfoot(columns, config); 113 | return '' + header + rowDef + tfoot +'
' 114 | } 115 | 116 | function renderSelectedAllCell(isHeader){ 117 | var cellTag = isHeader?'th': 'td'; 118 | return '<' + cellTag + ' width="10">'; 119 | } 120 | 121 | function buildTfoot(columns, config){ 122 | var firstCell = '' 123 | if(config.checkboxSupport){ 124 | firstCell = renderSelectedAllCell(false); 125 | } 126 | var colspan = columns.length; 127 | 128 | var showPageGotoEle = ''; 129 | if(config.paginationInfo){ 130 | var showPageGoto = config.paginationInfo.showPageGoto; 131 | if(showPageGoto){ 132 | showPageGotoEle = ' show-page-goto="'+ config.paginationInfo.showPageGoto + '" '; 133 | } 134 | } 135 | 136 | var pagination = '
' + 137 | '
'; 139 | var batchOperationBarDirective = config.batchOperationBarDirective || ''; 140 | var batchBar = '
' + batchOperationBarDirective + '
'; 141 | var secondCell = '' + batchBar + pagination +'' 142 | if(batchOperationBarDirective != '' || config.paginationSupport){ 143 | return '' + firstCell + secondCell + '' 144 | } 145 | return ''; 146 | } 147 | 148 | function buildHeader(columns, config){ 149 | var headerContent = ''; 150 | if(config.checkboxSupport){ 151 | headerContent = renderSelectedAllCell(true); 152 | } 153 | angular.forEach(columns, function(col){ 154 | var cssProperty = col.cssProperty ? ' class="' + col.cssProperty + '" ' : ""; 155 | var filterOptionKey = col.filterOptionKey; 156 | 157 | var tableHeaderFilter = ''; 158 | var preSelectedFilter = ''; 159 | var clientSort = ''; 160 | if(config.preSelectionFilter){ 161 | preSelectedFilter = ' pre-selected-id="filterParams.' + filterOptionKey + '"'; 162 | } 163 | 164 | if(filterOptionKey){ 165 | tableHeaderFilter = ' aliyun-console-table-search '+ preSelectedFilter + ' filter-field="' + filterOptionKey + '" items="filterItems.'+ filterOptionKey + '" click-action="changeTheadFilter(data)" ' 166 | }else{ 167 | if(config.clientSort && col.field){ 168 | clientSort = '' 169 | } 170 | } 171 | headerContent += '' + col.name + clientSort + '' 172 | }) 173 | return '' + headerContent + '' 174 | } 175 | 176 | function buildRows(columns, config){ 177 | var useBindOnce = config.useBindOnce ? 'bindonce' : ''; 178 | var rowItemName = config.rowItemName ? config.rowItemName : 'item'; 179 | var itemList = config.itemList || 'store'; 180 | var rowItem = ''; 181 | if(config.checkboxSupport){ 182 | config.selectedScopeProperty = config.selectedScopeProperty || 'selectedItems'; 183 | var selectedBindingKey = rowItemName + '.' + config.selectedProperty; 184 | var checkboxDisabledProperty = config.checkboxDisabledProperty; 185 | var checkboxDisabledSetting = '' 186 | if(checkboxDisabledProperty){ 187 | checkboxDisabledSetting = ' data-ng-disabled="' + rowItemName + '.' + checkboxDisabledProperty + '" '; 188 | } 189 | rowItem = ''; 191 | } 192 | angular.forEach(columns, function(col){ 193 | var cellContent = cellRender(col, rowItemName, useBindOnce); 194 | var cssProperty = col.cssProperty ? ' class="' + col.cssProperty + '" ' : ""; 195 | rowItem += '' + cellContent + '' 196 | }) 197 | return '' + rowItem + '' 198 | } 199 | 200 | function cellRender(colDef, rowItemName, useBindOnce){ 201 | var cellContent = ''; 202 | var cellFilter = colDef.filter; 203 | var colField = colDef.field; 204 | var itemString = rowItemName + '.' + colField; 205 | var fieldDirective = colDef.filedDirective || colDef.fieldDirective; 206 | if(fieldDirective){ 207 | return fieldDirective; 208 | } 209 | if(colField){ 210 | if(cellFilter){ 211 | itemString += '|' + cellFilter; 212 | } 213 | if(colDef.truncateText){ 214 | var textLength = colDef.truncateTextLegnth || colDef.truncateTextLength; // fix typo issue 215 | var textLengthText = textLength ? ' text-length=' + textLength : ''; 216 | cellContent = ''; 217 | }else{ 218 | if(colDef.bindable == true || useBindOnce == false){ 219 | if(colDef.htmlField){ 220 | cellContent = '' 221 | }else{ 222 | cellContent = '{{' + itemString +'}}' 223 | } 224 | }else{ 225 | var bindTag = colDef.htmlField ? 'bo-html': 'bo-text'; 226 | cellContent = '' 227 | } 228 | } 229 | } 230 | return cellContent; 231 | } 232 | 233 | /** 234 | * 将查询参数转换为请求的参数params. 235 | * @param data 236 | * @returns {{}} 237 | */ 238 | function convertSearchParamsToOption(data){ 239 | var params = {}; 240 | angular.extend(params, data.pageInfo); 241 | angular.extend(params, data.filterParams); 242 | var searchParams = data.searchParams; 243 | if(searchParams){ 244 | var newObj = {}; 245 | if(searchParams.key && searchParams.value){ 246 | newObj[searchParams.key] = searchParams['value']; 247 | } 248 | angular.extend(params, newObj); 249 | } 250 | return params; 251 | } 252 | 253 | directiveModule.directive('aliyunSimpleGrid', ['$compile', '$filter', function($compile, $filter) { 254 | return{ 255 | restrict: 'A', 256 | scope: { 257 | columns: '=', 258 | store: '=', 259 | config: '=', 260 | paginationInfo: '=', 261 | loadingState: '=', 262 | renderTable: '&', 263 | searchPreHandler: '&', 264 | selectionChange: '&' 265 | }, 266 | templateUrl: 'scripts/template/simpleGrid.html', 267 | controller: ['$scope', function($scope){ 268 | $scope.initTableRequestSend = false; 269 | $scope._searchPreHandler = function(data, isFilter){ 270 | if(angular.isFunction($scope.searchPreHandler)){ 271 | $scope.searchPreHandler({ 272 | data: { 273 | data: data, 274 | scope: $scope, 275 | isTableFilter: isFilter 276 | } 277 | }) 278 | } 279 | } 280 | 281 | /** 282 | * 改变选择全部。 283 | */ 284 | $scope.changeSelectionAll = function(){ 285 | var config = $scope.config; 286 | var itemName = config.selectedProperty; 287 | var checkboxDisabledProperty = config.checkboxDisabledProperty; 288 | var selectState = $scope.tableState.selectAll; 289 | var selectedItems = []; 290 | angular.forEach($scope.store, function(item, index){ 291 | if(checkboxDisabledProperty && item[checkboxDisabledProperty]){ 292 | //do nothing. 293 | }else{ 294 | item[itemName] = selectState; 295 | if(selectState){ 296 | selectedItems.push(item) 297 | } 298 | } 299 | }) 300 | $scope.selectionChangeHandler(selectedItems); 301 | } 302 | 303 | $scope.clientSortHandler = function(field){ 304 | $scope.reserves = !$scope.reserves 305 | var orderBy = $filter('orderBy'); 306 | $scope.store = orderBy($scope.store,field, $scope.reserves) 307 | } 308 | 309 | /** 310 | * 改变一行的选择 311 | * @param item 312 | */ 313 | $scope.changeSelection = function(item){ 314 | var itemName = $scope.config.selectedProperty; 315 | item[itemName] = !item[itemName]; 316 | var firstRowState; 317 | var unique = true; 318 | var itemSelected = []; 319 | angular.forEach($scope.store, function(item, index){ 320 | var rowState = item[itemName]; 321 | if(index == 0){ 322 | firstRowState = rowState; 323 | } 324 | if(firstRowState != rowState){ 325 | unique = false; 326 | } 327 | if(rowState){ 328 | itemSelected.push(item); 329 | } 330 | }) 331 | if(unique == true){ 332 | $scope.tableState.selectAll = firstRowState; 333 | }else{ 334 | $scope.tableState.selectAll = false; 335 | } 336 | $scope.selectionChangeHandler(itemSelected); 337 | } 338 | 339 | 340 | $scope.selectionChangeHandler = function(selectedItems){ 341 | var configProp = $scope.config.selectedScopeProperty; 342 | $scope[configProp] = selectedItems; 343 | $scope.selectionChange({ 344 | data: selectedItems 345 | }) 346 | } 347 | 348 | /** 349 | * 刷新按钮的调用方法。 350 | * 清除所有的过滤和查询条件。 351 | */ 352 | $scope.refreshCurrentView = function(){ 353 | $scope.filterParams = {}; 354 | $scope.searchParams = {}; 355 | $scope.updateList(); 356 | } 357 | 358 | }], 359 | link: function (scope, element, attrs) { 360 | scope.tableState = { 361 | selectAll: false 362 | } 363 | scope.filterParams = {}; 364 | scope.searchParams = {}; 365 | 366 | /** 367 | * 当表头发生变化和过滤后的事件。 368 | * @param data 369 | */ 370 | scope.changeTheadFilter = function(data){ 371 | scope._searchPreHandler(data, true); 372 | var filterField = data.filterField; 373 | var filterItem = data.item; 374 | var dest = scope.filterParams || {}; 375 | if(filterField){ 376 | if(filterItem.id == 'all'){ 377 | delete dest[filterField]; 378 | }else{ 379 | dest[filterField] = filterItem.id; 380 | } 381 | }; 382 | scope.filterParams = dest; 383 | scope.paginationInfo.page = 1; 384 | scope.searchParams = {}; 385 | scope.updateList(); 386 | } 387 | 388 | scope.pageChanged = function(page){ 389 | scope.paginationInfo.page = page; 390 | scope.updateList(); 391 | } 392 | 393 | /** 394 | * 当用户点击搜索的时候取消所有的过滤条件。 395 | * @param data 396 | */ 397 | scope.searchAction = function(data){ 398 | scope._searchPreHandler(data, false); 399 | if(scope.config.paginationSupport){ 400 | scope.paginationInfo && (scope.paginationInfo.page = 1); 401 | } 402 | scope.filterParams = {}; 403 | scope.searchParams = data; 404 | scope.updateList(); 405 | } 406 | 407 | scope.updateList = function(isInitTableRequest){ 408 | if(isInitTableRequest){ 409 | scope.initTableRequestSend = true; 410 | } 411 | var config = scope.config; 412 | var paginationInfo = scope.paginationInfo; 413 | var params = {}; 414 | if(config.paginationSupport){ 415 | if(paginationInfo == undefined){ 416 | paginationInfo = config.paginationInfo; 417 | scope.maxSize = config.paginationInfo.maxSize || 3; 418 | } 419 | params.pageInfo = { 420 | pageSize: paginationInfo.pageSize, 421 | currentPage: paginationInfo.page 422 | } 423 | } 424 | if(config.filterItems){ 425 | params.filterParams = scope.filterParams; 426 | } 427 | if(config.searchItems){ 428 | params.searchParams = scope.searchParams; 429 | } 430 | scope.renderTable({ 431 | data: { 432 | params: convertSearchParamsToOption(params), 433 | isInitTableRequest: isInitTableRequest 434 | } 435 | }) 436 | } 437 | 438 | scope.$watchCollection('[config, columns]', function(gridDef){ 439 | if(gridDef){ 440 | var config = gridDef[0]; 441 | if(config.filterItems){ 442 | scope.filterItems = config.filterItems; 443 | } 444 | if(config.searchItems){ 445 | scope.searchItems = config.searchItems; 446 | } 447 | if(config.preSelectionFilter){ 448 | scope.filterParams = config.preSelectionFilter; 449 | } 450 | if(config.preSelectionSearch){ 451 | scope.searchParams = config.preSelectionSearch; 452 | } 453 | if(config.checkboxSupport){ 454 | if(config.selectedProperty == undefined){ 455 | config.selectedProperty = 'selected' 456 | } 457 | } 458 | config.refreshCurrentView = scope.refreshCurrentView; 459 | var columnsDef = gridDef[1]; 460 | scope.noneDataInfoMessage = '没有查询到符合条件的记录'; 461 | scope.paginationSupport = config.paginationSupport; 462 | var searchBar = buildSearchBar(config, element); 463 | var tableContent = buildTable(columnsDef, config); 464 | // angular.element('.gridSection').html(tableContent); 465 | element.find(".gridSection").html(tableContent); 466 | $compile(element.contents())(scope); 467 | if(scope.initTableRequestSend == false){ 468 | scope.updateList(true); 469 | } 470 | } 471 | }) 472 | 473 | scope.$watchCollection('[store, paginationInfo]', function(gridDef){ 474 | if(gridDef){ 475 | var store = gridDef[0] || []; 476 | scope.showNoneDataInfoTip = store.length == 0 ? true:false; 477 | var pageInfo = gridDef[1]; 478 | /* 479 | 如果数据集合是空的,但是分页信息显示当前并不在第一页,那么说明需要往前跳一页来加载上一页的数据; 480 | 如果已经是第一页了,则不继续往前跳,直接显示数据为空 481 | */ 482 | if(store.length == 0 && pageInfo && pageInfo.page>1){ 483 | scope.paginationInfo.page -= 1; 484 | scope.updateList(); 485 | } 486 | } 487 | }) 488 | } 489 | } 490 | }]) 491 | }) 492 | -------------------------------------------------------------------------------- /app/templates/app/scripts/filters/_base.js: -------------------------------------------------------------------------------- 1 | define(['./filters'],function(){ 2 | 3 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/filters/filters.js: -------------------------------------------------------------------------------- 1 | define(['angular'], function (angular) { 2 | return angular.module('app.<%= project_name %>Filters', []); 3 | }); 4 | -------------------------------------------------------------------------------- /app/templates/app/scripts/main.js: -------------------------------------------------------------------------------- 1 | (function(){ 2 | require.config({ 3 | baseUrl:"scripts/", 4 | skipDataMain: true, 5 | paths: { 6 | 'angular': '../vendor/angular/angular', 7 | // 'highcharts' : '../vendor/highcharts/highcharts', 8 | "ui.router":'../vendor/angular-ui-router/release/angular-ui-router.min', 9 | 'bindonce': '../vendor/angular-bindonce/bindonce', 10 | "ui.bootstrap":"../vendor/bootstrap/dist/js/bootstrap.min", 11 | "jQuery":'../vendor/jquery/jquery.min', 12 | 'app-tpl': './app-tpl', 13 | 'highcharts':'../vendor/highcharts/highcharts' 14 | }, 15 | shim: { 16 | 'jQuery': { exports: 'jQuery'}, 17 | 'angular': { 18 | exports:'angular', 19 | deps: ['jQuery'] 20 | }, 21 | 'app-tpl': { deps: ['angular']}, 22 | 'app-tpl': { deps: ['angular']}, 23 | 'bindonce': { deps: ['angular']}, 24 | 'highcharts': {deps: ['jQuery']}, 25 | 'ui.router': {deps: ['angular']} 26 | } 27 | }); 28 | })(); 29 | -------------------------------------------------------------------------------- /app/templates/app/scripts/main.min.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/app/templates/app/scripts/main.min.js -------------------------------------------------------------------------------- /app/templates/app/scripts/services/_base.js: -------------------------------------------------------------------------------- 1 | define(['./services'],function(){ 2 | 3 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/services/services.js: -------------------------------------------------------------------------------- 1 | define(['angular'], function (angular) { 2 | return angular.module('app.<%= project_name %>Services', []); 3 | }); 4 | -------------------------------------------------------------------------------- /app/templates/app/scripts/states/_base.js: -------------------------------------------------------------------------------- 1 | define(['./home'],function(){ 2 | 3 | }); -------------------------------------------------------------------------------- /app/templates/app/scripts/states/home.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 默认的产品首页和默认的跳转规则 3 | */ 4 | define(['./states', '../cons/simpleCons','../controllers/homeController'], 5 | function (stateModule, cons) { 6 | stateModule.config( 7 | ['$stateProvider', '$urlRouterProvider', 8 | function ($stateProvider, $urlRouterProvider) { 9 | $urlRouterProvider 10 | .otherwise('/'); 11 | 12 | $stateProvider 13 | .state("home", { 14 | url: "/", 15 | controller: 'homeController', 16 | templateUrl: cons.VIEW_PATH + 'home.html' 17 | }) 18 | .state("view1", { 19 | url: "/view1", 20 | controller: 'view1Controller', 21 | templateUrl: cons.VIEW_PATH + 'view1.html' 22 | }); 23 | }]) 24 | }) -------------------------------------------------------------------------------- /app/templates/app/scripts/states/states.js: -------------------------------------------------------------------------------- 1 | define(['angular'],function(angular){ 2 | return angular.module('app.<%= project_name %>States', []); 3 | }) -------------------------------------------------------------------------------- /app/templates/app/scripts/views/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/app/templates/app/scripts/views/.DS_Store -------------------------------------------------------------------------------- /app/templates/app/scripts/views/home.html: -------------------------------------------------------------------------------- 1 | {{message}} -------------------------------------------------------------------------------- /app/templates/app/scripts/views/view1.html: -------------------------------------------------------------------------------- 1 | {{message}} -------------------------------------------------------------------------------- /app/templates/app/styles/app.scss: -------------------------------------------------------------------------------- 1 | @import "compass"; -------------------------------------------------------------------------------- /app/templates/bowerrc: -------------------------------------------------------------------------------- 1 | { 2 | "directory":"app/vendor" 3 | } -------------------------------------------------------------------------------- /app/templates/editorconfig: -------------------------------------------------------------------------------- 1 | # http://editorconfig.org 2 | root = true 3 | 4 | [*] 5 | indent_style = space 6 | indent_size = 2 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /app/templates/gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto 2 | -------------------------------------------------------------------------------- /app/templates/gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | temp/ 3 | -------------------------------------------------------------------------------- /app/templates/gruntSetting.json: -------------------------------------------------------------------------------- 1 | { 2 | "projectName": "yundun", 3 | "gitRepo": "git@gitlab.alibaba-inc.com:aliyun/yundun.git", 4 | "branchName":"master", 5 | "appFolder": "app", 6 | "activeFolder": ".tmp", 7 | "buildFolder": "build", 8 | "tmpFolder": ".tmp", 9 | "mockupSrcFolder": "tests/data", 10 | "mockupTargetFolder": ".tmp/", 11 | "appPort": 3000, 12 | "hostName": "0.0.0.0", 13 | "liveReloadPort": 35729 14 | } 15 | -------------------------------------------------------------------------------- /app/templates/grunt_server/index.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var app = express(); 3 | var path = require('path'); 4 | var cwd = process.cwd(); 5 | var router = express.Router(); 6 | var logger = require('morgan'); 7 | var fs = require('fs'); 8 | 9 | //TODO:mock data 10 | function mock(req,res,next){ 11 | fs.readFile(path.join(process.cwd() + '/tests') + req.url.split('?')[0], function(err,data){ 12 | if(err != null){ 13 | res.send(err.toString()) 14 | }else{ 15 | res.send(data.toString()) 16 | } 17 | }); 18 | }; 19 | 20 | function appServer(currentFolder){ 21 | app.use('/',express.static(path.join(cwd,currentFolder))); 22 | app.use('/vendor',express.static(path.join(cwd,currentFolder + '/vendor'))); 23 | app.use('/scripts',express.static(path.join(cwd,currentFolder + '/scripts'))); 24 | app.use('/styles',express.static(path.join(cwd,currentFolder + '/styles'))); 25 | 26 | app.use(logger()); 27 | 28 | //以上为静态资源目录,除了以上路径,其他都默认为mock数据 29 | app.get('**/*.json',express.static(path.join(cwd,'/tests'))); 30 | //处理post 31 | app.all('**/*.json',mock); 32 | 33 | return app; 34 | }; 35 | module.exports = appServer; -------------------------------------------------------------------------------- /app/templates/jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "node": true, 3 | "esnext": true, 4 | "bitwise": true, 5 | "camelcase": true, 6 | "curly": true, 7 | "eqeqeq": true, 8 | "immed": true, 9 | "indent": 2, 10 | "latedef": true, 11 | "newcap": true, 12 | "noarg": true, 13 | "quotmark": "single", 14 | "regexp": true, 15 | "undef": true, 16 | "unused": true, 17 | "strict": true, 18 | "trailing": true, 19 | "smarttabs": true, 20 | "white": true 21 | } 22 | -------------------------------------------------------------------------------- /app/templates/test-creation.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it */ 2 | 'use strict'; 3 | var path = require('path'); 4 | var helpers = require('yeoman-generator').test; 5 | 6 | describe('<%= generatorName %> generator', function () { 7 | beforeEach(function (done) { 8 | helpers.testDirectory(path.join(__dirname, 'temp'), function (err) { 9 | if (err) { 10 | return done(err); 11 | } 12 | 13 | this.app = helpers.createGenerator('<%= generatorName %>:app', [ 14 | '../../app' 15 | ]); 16 | done(); 17 | }.bind(this)); 18 | }); 19 | 20 | it('creates expected files', function (done) { 21 | var expected = [ 22 | // add files you expect to exist here. 23 | '.jshintrc', 24 | '.editorconfig' 25 | ]; 26 | 27 | helpers.mockPrompt(this.app, { 28 | 'someOption': true 29 | }); 30 | this.app.options['skip-install'] = true; 31 | this.app.run({}, function () { 32 | helpers.assertFile(expected); 33 | done(); 34 | }); 35 | }); 36 | }); 37 | -------------------------------------------------------------------------------- /app/templates/test-load.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | var assert = require('assert'); 4 | 5 | describe('<%= generatorName %> generator', function () { 6 | it('can be imported without blowing up', function () { 7 | var app = require('../app'); 8 | assert(app !== undefined); 9 | }); 10 | }); 11 | -------------------------------------------------------------------------------- /app/templates/tests/home/home.json: -------------------------------------------------------------------------------- 1 | { 2 | "code":"200", 3 | "message": "successful", 4 | "data": { 5 | "key":"这里是key", 6 | "value":"这里是value" 7 | }, 8 | "success":true 9 | } -------------------------------------------------------------------------------- /app/templates/tests/home/postData.json: -------------------------------------------------------------------------------- 1 | { 2 | "code":"200", 3 | "message": "successful", 4 | "data": { 5 | "key":"postvalue" 6 | }, 7 | "success":true 8 | } -------------------------------------------------------------------------------- /controllers/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/controllers/.DS_Store -------------------------------------------------------------------------------- /controllers/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var util = require('util'); 3 | var yeoman = require('yeoman-generator'); 4 | 5 | 6 | var WebbpGenerator = yeoman.generators.NamedBase.extend({ 7 | initializing: function () { 8 | this.log('You called the webbp subgenerator with the argument ' + this.name + '.'); 9 | }, 10 | 11 | writing: function () { 12 | this.sub = []; 13 | var temp = this.name.split('.'); 14 | var rootController = this.rootController = temp[0]; 15 | var sub = temp.length > 0 && temp.slice(1); 16 | 17 | 18 | 19 | if(sub && sub.length){ 20 | this.sub = sub; 21 | sub.forEach(function(item){ 22 | this.subControllerName = item; 23 | this.template('_subController.js','app/scripts/controllers/' + rootController + '/' + item + 'Controller.js'); 24 | }.bind(this)); 25 | } 26 | this.template('_controller.js','app/scripts/controllers/' + rootController + 'Controller.js'); 27 | } 28 | }); 29 | 30 | module.exports = WebbpGenerator; 31 | -------------------------------------------------------------------------------- /controllers/templates/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/controllers/templates/.DS_Store -------------------------------------------------------------------------------- /controllers/templates/_controller.js: -------------------------------------------------------------------------------- 1 | // This is a file copied by your subgenerator 2 | define([ 3 | './controllers' 4 | <% for(var i=0;i 5 | <% if(i <= sub.length -1){%>,<%}%>'./<%= rootController %>/<%= sub[i] %>Controller' 6 | <% } %> 7 | ], function (mod) { 8 | mod.controller('<%= rootController %>Controller', controllerFn); 9 | 10 | controllerFn.$injector = ['$scope', '$injector']; 11 | function controllerFn($scope, $injector){ 12 | 13 | }; 14 | }); 15 | -------------------------------------------------------------------------------- /controllers/templates/_subController.js: -------------------------------------------------------------------------------- 1 | // This is a file copied by your subgenerator 2 | define(['./../controllers'], function (mod) { 3 | mod.controller('<%= rootController %>.<%= subControllerName %>Controller', controllerFn); 4 | 5 | controllerFn.$injector = ['$scope', '$injector']; 6 | function controllerFn($scope, $injector){ 7 | 8 | }; 9 | }); 10 | -------------------------------------------------------------------------------- /npm-debug.log: -------------------------------------------------------------------------------- 1 | 0 info it worked if it ends with ok 2 | 1 verbose cli [ 'node', '/usr/local/bin/npm', 'publish' ] 3 | 2 info using npm@1.4.9 4 | 3 info using node@v0.10.28 5 | 4 verbose publish [ '.' ] 6 | 5 verbose cache add [ '.', null ] 7 | 6 verbose cache add name=undefined spec="." args=[".",null] 8 | 7 verbose parsed url { protocol: null, 9 | 7 verbose parsed url slashes: null, 10 | 7 verbose parsed url auth: null, 11 | 7 verbose parsed url host: null, 12 | 7 verbose parsed url port: null, 13 | 7 verbose parsed url hostname: null, 14 | 7 verbose parsed url hash: null, 15 | 7 verbose parsed url search: null, 16 | 7 verbose parsed url query: null, 17 | 7 verbose parsed url pathname: '.', 18 | 7 verbose parsed url path: '.', 19 | 7 verbose parsed url href: '.' } 20 | 8 silly lockFile 3a52ce78- . 21 | 9 verbose lock . /Users/chengchi/.npm/3a52ce78-.lock 22 | 10 verbose tar pack [ '/var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz', 23 | 10 verbose tar pack '.' ] 24 | 11 verbose tarball /var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 25 | 12 verbose folder . 26 | 13 info prepublish generator-webbp@0.0.1 27 | 14 silly lockFile 1f1177db-tar tar://. 28 | 15 verbose lock tar://. /Users/chengchi/.npm/1f1177db-tar.lock 29 | 16 silly lockFile 1f0580cf-6906-0-10940391407348216-tmp-tgz tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 30 | 17 verbose lock tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz /Users/chengchi/.npm/1f0580cf-6906-0-10940391407348216-tmp-tgz.lock 31 | 18 silly lockFile 1f1177db-tar tar://. 32 | 19 silly lockFile 1f1177db-tar tar://. 33 | 20 silly lockFile 1f0580cf-6906-0-10940391407348216-tmp-tgz tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 34 | 21 silly lockFile 1f0580cf-6906-0-10940391407348216-tmp-tgz tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 35 | 22 verbose tar unpack /var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 36 | 23 silly lockFile eb5e1259-pm-generator-webbp-0-0-1-package tar:///Users/chengchi/.npm/generator-webbp/0.0.1/package 37 | 24 verbose lock tar:///Users/chengchi/.npm/generator-webbp/0.0.1/package /Users/chengchi/.npm/eb5e1259-pm-generator-webbp-0-0-1-package.lock 38 | 25 silly lockFile 1f0580cf-6906-0-10940391407348216-tmp-tgz tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 39 | 26 verbose lock tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz /Users/chengchi/.npm/1f0580cf-6906-0-10940391407348216-tmp-tgz.lock 40 | 27 silly gunzTarPerm modes [ '755', '644' ] 41 | 28 silly gunzTarPerm extractEntry package.json 42 | 29 silly gunzTarPerm extractEntry README.md 43 | 30 silly gunzTarPerm extractEntry app/index.js 44 | 31 silly gunzTarPerm extractEntry app/templates/README.md 45 | 32 silly gunzTarPerm extractEntry app/templates/_Gruntfile.js 46 | 33 silly gunzTarPerm extractEntry app/templates/test-creation.js 47 | 34 silly gunzTarPerm extractEntry app/templates/test-load.js 48 | 35 silly gunzTarPerm extractEntry app/templates/_travis.yml 49 | 36 silly gunzTarPerm extractEntry app/templates/app/index.html 50 | 37 silly gunzTarPerm extractEntry app/templates/app/scripts/_build.js 51 | 38 silly gunzTarPerm extractEntry app/templates/app/scripts/bootstrap.js 52 | 39 silly gunzTarPerm extractEntry app/templates/app/scripts/app.js 53 | 40 silly gunzTarPerm extractEntry app/templates/app/scripts/main.js 54 | 41 silly gunzTarPerm extractEntry app/templates/app/scripts/controllers/_base.js 55 | 42 silly gunzTarPerm extractEntry app/templates/app/scripts/controllers/controllers.js 56 | 43 silly gunzTarPerm extractEntry app/templates/app/scripts/controllers/homeController.js 57 | 44 silly gunzTarPerm extractEntry app/templates/app/scripts/views/home.html 58 | 45 silly gunzTarPerm extractEntry app/templates/app/scripts/views/view1.html 59 | 46 silly gunzTarPerm extractEntry app/templates/app/scripts/filters/_base.js 60 | 47 silly gunzTarPerm extractEntry app/templates/app/scripts/filters/filters.js 61 | 48 silly gunzTarPerm extractEntry app/templates/app/scripts/cons/simpleCons.js 62 | 49 silly gunzTarPerm extractEntry app/templates/app/scripts/services/_base.js 63 | 50 silly gunzTarPerm extractEntry app/templates/app/scripts/services/services.js 64 | 51 silly gunzTarPerm extractEntry app/templates/app/scripts/states/_base.js 65 | 52 silly gunzTarPerm extractEntry app/templates/app/scripts/states/home.js 66 | 53 silly gunzTarPerm extractEntry app/templates/app/scripts/states/states.js 67 | 54 silly gunzTarPerm extractEntry app/templates/app/scripts/directives/_base.js 68 | 55 silly gunzTarPerm extractEntry app/templates/app/scripts/directives/directives.js 69 | 56 silly gunzTarPerm extractEntry app/templates/app/scripts/directives/simpleGrid.js 70 | 57 silly gunzTarPerm extractEntry app/templates/app/styles/app.scss 71 | 58 silly gunzTarPerm extractEntry app/templates/app/styles/bootstrap/bootstrap.css 72 | 59 silly gunzTarPerm extractEntry app/templates/bowerrc 73 | 60 silly gunzTarPerm extractEntry app/templates/editorconfig 74 | 61 silly gunzTarPerm extractEntry app/templates/tests/home/home.json 75 | 62 silly gunzTarPerm extractEntry app/templates/tests/home/postData.json 76 | 63 silly gunzTarPerm extractEntry app/templates/gitignore 77 | 64 silly gunzTarPerm extractEntry app/templates/gruntSetting.json 78 | 65 silly gunzTarPerm extractEntry app/templates/grunt_server/index.js 79 | 66 silly gunzTarPerm extractEntry app/templates/jshintrc 80 | 67 silly gunzTarPerm extractEntry app/templates/_bower.json 81 | 68 silly gunzTarPerm extractEntry app/templates/_package.json 82 | 69 silly gunzTarPerm extractEntry app/templates/gitattributes 83 | 70 silly gunzTarPerm extractEntry controllers/index.js 84 | 71 silly gunzTarPerm extractEntry controllers/templates/_controller.js 85 | 72 silly gunzTarPerm extractEntry controllers/templates/_subController.js 86 | 73 silly gunzTarPerm extractEntry routes/index.js 87 | 74 silly gunzTarPerm extractEntry routes/templates/_state.js 88 | 75 silly gunzTarPerm extractEntry views/index.js 89 | 76 silly gunzTarPerm extractEntry views/templates/_subView.js 90 | 77 silly gunzTarPerm extractEntry views/templates/_view.js 91 | 78 silly lockFile eb5e1259-pm-generator-webbp-0-0-1-package tar:///Users/chengchi/.npm/generator-webbp/0.0.1/package 92 | 79 silly lockFile eb5e1259-pm-generator-webbp-0-0-1-package tar:///Users/chengchi/.npm/generator-webbp/0.0.1/package 93 | 80 silly lockFile 1f0580cf-6906-0-10940391407348216-tmp-tgz tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 94 | 81 silly lockFile 1f0580cf-6906-0-10940391407348216-tmp-tgz tar:///var/folders/8h/0glsdm196c1g0hsss40d7gsr0000gn/T/npm-7578-Oa3KrlAJ/1416036816906-0.10940391407348216/tmp.tgz 95 | 82 silly lockFile 3a52ce78- . 96 | 83 silly lockFile 3a52ce78- . 97 | 84 silly publish { name: 'generator-webbp', 98 | 84 silly publish version: '0.0.1', 99 | 84 silly publish description: 'Yeoman generator', 100 | 84 silly publish license: 'MIT', 101 | 84 silly publish main: 'app/index.js', 102 | 84 silly publish repository: { type: 'git', url: 'git://github.com/cc17/generator-webbp' }, 103 | 84 silly publish author: 104 | 84 silly publish { name: 'chengchi', 105 | 84 silly publish email: 'dengxiaoming1217@gmail.com', 106 | 84 silly publish url: 'https://github.com/cc17' }, 107 | 84 silly publish engines: { node: '>=0.10.0' }, 108 | 84 silly publish scripts: { test: 'mocha' }, 109 | 84 silly publish files: [ 'app', 'controllers', 'routes', 'views' ], 110 | 84 silly publish keywords: [ 'yeoman-generator' ], 111 | 84 silly publish dependencies: 112 | 84 silly publish { 'yeoman-generator': '^0.17.0', 113 | 84 silly publish chalk: '^0.5.0', 114 | 84 silly publish yosay: '^0.3.0' }, 115 | 84 silly publish devDependencies: { mocha: '*' }, 116 | 84 silly publish peerDependencies: { yo: '>=1.0.0' }, 117 | 84 silly publish readme: '# generator-webbp [![Build Status](https://secure.travis-ci.org/cc17/generator-webbp.png?branch=master)](https://travis-ci.org/cc17/generator-webbp)\n\n> [Yeoman](http://yeoman.io) generator\n\n\n## Getting Started\n\n```bash\nnpm install -g yo\n```\n\n### Yeoman Generators\n\nYeoman travels light. He didn\'t pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension.\n\nTo install generator-webbp from npm, run:\n\n```bash\nnpm install -g generator-webbp\n```\n\nFinally, initiate the generator:\n\n```bash\nyo webbp\n```\n\n## 子命令\n\n* 单步生成controller\n\n```js\nyo webbp:controllers detail.about.contact\n```\n亮点:可以嵌套,此命令会生成如下文件\n```bash\n|controllers\n |detail\n |about.js\n |contact.js\n detail.js\n```\n另外detail.js中会自动加载about.js及contact.js\n\n* 单步生成views\n\n```js\nyo webbp:views detail.about.contact\n```\n亮点:可以嵌套,此命令会生成如下文件\n```bash\n|views\n |detail\n |about.html\n |contact.html\n detail.html\n```\n* 单步生成routes\n\n```js\nyo webbp:routess detail.about.contact\n```\n亮点:可以嵌套,此命令会生成如下文件\n```bash\n|states\n |detail.js\n```\n其内容是:\n```js\ndefine([\'./states\', \'../cons/simpleCons\'],\n function (stateModule, simpleCons) {\n stateModule.config(\n [\'$stateProvider\', \'$urlRouterProvider\',\n function ($stateProvider, $urlRouterProvider) {\n $stateProvider.state("detail", {\n abstract: true,\n resolve: {\n instanceBasicPromise: [ \'$stateParams\', function( $stateParams){\n\n }]\n },\n url: "/detail",\n controller: \'detailController\',\n templateUrl: simpleCons.VIEW_PATH + \'detail.html\'\n })\n \n .state("detail.about", {\n url: "/about",\n views: {\n detail: {\n templateUrl: simpleCons.VIEW_PATH + \'detail/about.html\',\n controller: \'detail.aboutController\'\n }\n }\n }) \n \n }\n ]);\n })\n```\n亮点:通过运行此命令,会自动生成 routes(用的是ui-router,目录是states目录),view,controller。有没有觉得很爽的感觉。\n\n\n\n\n## License\n\nMIT\n', 118 | 84 silly publish readmeFilename: 'README.md', 119 | 84 silly publish bugs: { url: 'https://github.com/cc17/generator-webbp/issues' }, 120 | 84 silly publish homepage: 'https://github.com/cc17/generator-webbp', 121 | 84 silly publish _id: 'generator-webbp@0.0.1', 122 | 84 silly publish _shasum: '28a7c53d3efa4995874ec4c53a30b7802600a072', 123 | 84 silly publish _from: '.' } 124 | 85 verbose url raw generator-webbp 125 | 86 verbose url resolving [ 'https://registry.npmjs.org/', './generator-webbp' ] 126 | 87 verbose url resolved https://registry.npmjs.org/generator-webbp 127 | 88 info trying registry request attempt 1 at 15:33:37 128 | 89 http PUT https://registry.npmjs.org/generator-webbp 129 | 90 http 403 https://registry.npmjs.org/generator-webbp 130 | 91 verbose headers { date: 'Sat, 15 Nov 2014 07:33:39 GMT', 131 | 91 verbose headers server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)', 132 | 91 verbose headers 'content-type': 'application/json', 133 | 91 verbose headers 'cache-control': 'max-age=60', 134 | 91 verbose headers 'content-length': '5784', 135 | 91 verbose headers 'accept-ranges': 'bytes', 136 | 91 verbose headers via: '1.1 varnish', 137 | 91 verbose headers 'x-served-by': 'cache-ty68-TYO', 138 | 91 verbose headers 'x-cache': 'MISS', 139 | 91 verbose headers 'x-cache-hits': '0', 140 | 91 verbose headers 'x-timer': 'S1416036818.472609,VS0,VE568', 141 | 91 verbose headers 'keep-alive': 'timeout=10, max=50', 142 | 91 verbose headers connection: 'Keep-Alive' } 143 | 92 error publish Failed PUT 403 144 | 93 error Error: forbidden cannot modify pre-existing version: 0.0.1 145 | 93 error old={"name":"generator-webbp","version":"0.0.1","description":"Yeoman generator","license":"MIT","main":"app/index.js","repository":{"type":"git","url":"git://github.com/cc17/generator-webbp"},"author":{"name":"chengchi","email":"dengxiaoming1217@gmail.com","url":"https://github.com/cc17"},"engines":{"node":">=0.10.0"},"scripts":{"test":"mocha"},"files":["app","controllers","routes","views"],"keywords":["yeoman-generator"],"dependencies":{"yeoman-generator":"^0.17.0","chalk":"^0.5.0","yosay":"^0.3.0"},"devDependencies":{"mocha":"*"},"peerDependencies":{"yo":">=1.0.0"},"bugs":{"url":"https://github.com/cc17/generator-webbp/issues"},"homepage":"https://github.com/cc17/generator-webbp","_id":"generator-webbp@0.0.1","_shasum":"28a7c53d3efa4995874ec4c53a30b7802600a072","_from":".","_npmVersion":"1.4.9","_npmUser":{"name":"cc17","email":"dengxiaoming1217@gmail.com"},"maintainers":[{"name":"cc17","email":"dengxiaoming1217@gmail.com"}],"dist":{"shasum":"28a7c53d3efa4995874ec4c53a30b7802600a072","tarball":"http://registry.npmjs.org/generator-webbp/-/generator-webbp-0.0.1.tgz"}} 146 | 93 error new={"name":"generator-webbp","version":"0.0.1","description":"Yeoman generator","license":"MIT","main":"app/index.js","repository":{"type":"git","url":"git://github.com/cc17/generator-webbp"},"author":{"name":"chengchi","email":"dengxiaoming1217@gmail.com","url":"https://github.com/cc17"},"engines":{"node":">=0.10.0"},"scripts":{"test":"mocha"},"files":["app","controllers","routes","views"],"keywords":["yeoman-generator"],"dependencies":{"yeoman-generator":"^0.17.0","chalk":"^0.5.0","yosay":"^0.3.0"},"devDependencies":{"mocha":"*"},"peerDependencies":{"yo":">=1.0.0"},"readme":"# generator-webbp [![Build Status](https://secure.travis-ci.org/cc17/generator-webbp.png?branch=master)](https://travis-ci.org/cc17/generator-webbp)\u000a\u000a> [Yeoman](http://yeoman.io) generator\u000a\u000a\u000a## Getting Started\u000a\u000a```bash\u000anpm install -g yo\u000a```\u000a\u000a### Yeoman Generators\u000a\u000aYeoman travels light. He didn't pack any generators when he moved in. You can think of a generator like a plug-in. You get to choose what type of application you wish to create, such as a Backbone application or even a Chrome extension.\u000a\u000aTo install generator-webbp from npm, run:\u000a\u000a```bash\u000anpm install -g generator-webbp\u000a```\u000a\u000aFinally, initiate the generator:\u000a\u000a```bash\u000ayo webbp\u000a```\u000a\u000a## 子命令\u000a\u000a* 单步生成controller\u000a\u000a```js\u000ayo webbp:controllers detail.about.contact\u000a```\u000a亮点:可以嵌套,此命令会生成如下文件\u000a```bash\u000a|controllers\u000a |detail\u000a |about.js\u000a |contact.js\u000a detail.js\u000a```\u000a另外detail.js中会自动加载about.js及contact.js\u000a\u000a* 单步生成views\u000a\u000a```js\u000ayo webbp:views detail.about.contact\u000a```\u000a亮点:可以嵌套,此命令会生成如下文件\u000a```bash\u000a|views\u000a |detail\u000a |about.html\u000a |contact.html\u000a detail.html\u000a```\u000a* 单步生成routes\u000a\u000a```js\u000ayo webbp:routess detail.about.contact\u000a```\u000a亮点:可以嵌套,此命令会生成如下文件\u000a```bash\u000a|states\u000a |detail.js\u000a```\u000a其内容是:\u000a```js\u000adefine(['./states', '../cons/simpleCons'],\u000a function (stateModule, simpleCons) {\u000a stateModule.config(\u000a ['$stateProvider', '$urlRouterProvider',\u000a function ($stateProvider, $urlRouterProvider) {\u000a $stateProvider.state(\"detail\", {\u000a abstract: true,\u000a resolve: {\u000a instanceBasicPromise: [ '$stateParams', function( $stateParams){\u000a\u000a }]\u000a },\u000a url: \"/detail\",\u000a controller: 'detailController',\u000a templateUrl: simpleCons.VIEW_PATH + 'detail.html'\u000a })\u000a \u000a .state(\"detail.about\", {\u000a url: \"/about\",\u000a views: {\u000a detail: {\u000a templateUrl: simpleCons.VIEW_PATH + 'detail/about.html',\u000a controller: 'detail.aboutController'\u000a }\u000a }\u000a }) \u000a \u000a }\u000a ]);\u000a })\u000a```\u000a亮点:通过运行此命令,会自动生成 routes(用的是ui-router,目录是states目录),view,controller。有没有觉得很爽的感觉。\u000a\u000a\u000a\u000a\u000a## License\u000a\u000aMIT\u000a","readmeFilename":"README.md","bugs":{"url":"https://github.com/cc17/generator-webbp/issues"},"homepage":"https://github.com/cc17/generator-webbp","_id":"generator-webbp@0.0.1","_shasum":"28a7c53d3efa4995874ec4c53a30b7802600a072","_from":".","_npmVersion":"1.4.9","_npmUser":{"name":"cc17","email":"dengxiaoming1217@gmail.com"},"maintainers":[{"name":"cc17","email":"dengxiaoming1217@gmail.com"}],"dist":{"shasum":"28a7c53d3efa4995874ec4c53a30b7802600a072","tarball":"http://registry.npmjs.org/generator-webbp/-/generator-webbp-0.0.1.tgz"}}: generator-webbp 147 | 93 error at RegClient. (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:273:14) 148 | 93 error at Request._callback (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:211:65) 149 | 93 error at Request.self.callback (/usr/local/lib/node_modules/npm/node_modules/request/request.js:123:22) 150 | 93 error at Request.EventEmitter.emit (events.js:98:17) 151 | 93 error at Request. (/usr/local/lib/node_modules/npm/node_modules/request/request.js:893:14) 152 | 93 error at Request.EventEmitter.emit (events.js:117:20) 153 | 93 error at IncomingMessage. (/usr/local/lib/node_modules/npm/node_modules/request/request.js:844:12) 154 | 93 error at IncomingMessage.EventEmitter.emit (events.js:117:20) 155 | 93 error at _stream_readable.js:919:16 156 | 93 error at process._tickCallback (node.js:419:13) 157 | 94 error If you need help, you may report this *entire* log, 158 | 94 error including the npm and node versions, at: 159 | 94 error 160 | 95 error System Darwin 13.4.0 161 | 96 error command "node" "/usr/local/bin/npm" "publish" 162 | 97 error cwd /Users/chengchi/Dev/generator-webbp 163 | 98 error node -v v0.10.28 164 | 99 error npm -v 1.4.9 165 | 100 verbose exit [ 1, true ] 166 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "generator-webbp", 3 | "version": "0.0.2", 4 | "description": "Yeoman generator", 5 | "license": "MIT", 6 | "main": "app/index.js", 7 | "repository": "cc17/generator-webbp", 8 | "author": { 9 | "name": "chengchi", 10 | "email": "dengxiaoming1217@gmail.com", 11 | "url": "https://github.com/cc17" 12 | }, 13 | "engines": { 14 | "node": ">=0.10.0" 15 | }, 16 | "scripts": { 17 | "test": "mocha" 18 | }, 19 | "files": [ 20 | "app", 21 | "controllers", 22 | "routes", 23 | "views" 24 | ], 25 | "keywords": [ 26 | "yeoman-generator" 27 | ], 28 | "dependencies": { 29 | "yeoman-generator": "^0.17.0", 30 | "chalk": "^0.5.0", 31 | "yosay": "^0.3.0" 32 | }, 33 | "devDependencies": { 34 | "mocha": "*" 35 | }, 36 | "peerDependencies": { 37 | "yo": ">=1.0.0" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /routes/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var util = require('util'); 3 | var yeoman = require('yeoman-generator'); 4 | var path = require('path'); 5 | var util = require('util'); 6 | 7 | 8 | var Generator = module.exports = function Generator() { 9 | yeoman.generators.NamedBase.apply(this, arguments); 10 | 11 | console.log(__dirname); 12 | 13 | this.hookFor('webbp:controllers' ); 14 | this.hookFor('webbp:views' ); 15 | }; 16 | 17 | util.inherits(Generator, yeoman.generators.NamedBase); 18 | 19 | Generator.prototype.createViewFiles = function createViewFiles() { 20 | 21 | this.subStates = []; 22 | var temp = this.name.split('.'); 23 | var rootState = this.rootState = temp[0]; 24 | var sub = temp.length > 0 && temp.slice(1); 25 | //有二级states 26 | if(sub && sub.length){ 27 | this.subStates = sub; 28 | } 29 | //生成state 30 | this.template('_state.js','app/scripts/states/' + rootState + '.js'); 31 | }; 32 | 33 | 34 | -------------------------------------------------------------------------------- /routes/templates/_state.js: -------------------------------------------------------------------------------- 1 | // This is a file copied by your subgenerator 2 | /** 3 | * 默认的产品首页和默认的跳转规则 4 | */ 5 | define(['./states', '../cons/simpleCons'], 6 | function (stateModule, simpleCons) { 7 | stateModule.config( 8 | ['$stateProvider', '$urlRouterProvider', 9 | function ($stateProvider, $urlRouterProvider) { 10 | $stateProvider.state("<%= rootState %>", { 11 | abstract: true, 12 | resolve: { 13 | instanceBasicPromise: [ '$stateParams', function( $stateParams){ 14 | 15 | }] 16 | }, 17 | url: "/<%= rootState %>", 18 | controller: '<%= rootState %>Controller', 19 | templateUrl: simpleCons.VIEW_PATH + '<%= rootState %>.html' 20 | }) 21 | <%for(var i=0;i 22 | .state("<%= rootState %>.<%= subStates[i] %>", { 23 | url: "/<%= subStates[i] %>", 24 | views: { 25 | <%= rootState %>: { 26 | templateUrl: simpleCons.VIEW_PATH + '<%= rootState %>/<%= subStates[i] %>.html', 27 | controller: '<%= rootState %>.<%= subStates[i] %>Controller' 28 | } 29 | } 30 | }) 31 | <% } %> 32 | } 33 | ]); 34 | }) 35 | -------------------------------------------------------------------------------- /test/test-app.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | 4 | var path = require('path'); 5 | var assert = require('yeoman-generator').assert; 6 | var helpers = require('yeoman-generator').test; 7 | var os = require('os'); 8 | 9 | describe('webbp:app', function () { 10 | before(function (done) { 11 | helpers.run(path.join(__dirname, '../app')) 12 | .inDir(path.join(os.tmpdir(), './temp-test')) 13 | .withOptions({ 'skip-install': true }) 14 | .withPrompt({ 15 | someOption: true 16 | }) 17 | .on('end', done); 18 | }); 19 | 20 | it('creates files', function () { 21 | assert.file([ 22 | 'bower.json', 23 | 'package.json', 24 | '.editorconfig', 25 | '.jshintrc' 26 | ]); 27 | }); 28 | }); 29 | -------------------------------------------------------------------------------- /test/test-controller.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | 4 | var path = require('path'); 5 | var assert = require('yeoman-generator').assert; 6 | var helpers = require('yeoman-generator').test; 7 | var os = require('os'); 8 | 9 | describe('webbp:controller', function () { 10 | before(function (done) { 11 | helpers.run(path.join(__dirname, '../controller')) 12 | .inDir(path.join(os.tmpdir(), './temp-test')) 13 | .withArguments('name', '--force') 14 | .on('end', done); 15 | }); 16 | 17 | it('creates files', function () { 18 | assert.file([ 19 | 'somefile.js' 20 | ]); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/test-routes.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | 4 | var path = require('path'); 5 | var assert = require('yeoman-generator').assert; 6 | var helpers = require('yeoman-generator').test; 7 | var os = require('os'); 8 | 9 | describe('webbp:routes', function () { 10 | before(function (done) { 11 | helpers.run(path.join(__dirname, '../routes')) 12 | .inDir(path.join(os.tmpdir(), './temp-test')) 13 | .withArguments('name', '--force') 14 | .on('end', done); 15 | }); 16 | 17 | it('creates files', function () { 18 | assert.file([ 19 | 'somefile.js' 20 | ]); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/test-services.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | 4 | var path = require('path'); 5 | var assert = require('yeoman-generator').assert; 6 | var helpers = require('yeoman-generator').test; 7 | var os = require('os'); 8 | 9 | describe('webbp:services', function () { 10 | before(function (done) { 11 | helpers.run(path.join(__dirname, '../services')) 12 | .inDir(path.join(os.tmpdir(), './temp-test')) 13 | .withArguments('name', '--force') 14 | .on('end', done); 15 | }); 16 | 17 | it('creates files', function () { 18 | assert.file([ 19 | 'somefile.js' 20 | ]); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /test/test-views.js: -------------------------------------------------------------------------------- 1 | /*global describe, beforeEach, it*/ 2 | 'use strict'; 3 | 4 | var path = require('path'); 5 | var assert = require('yeoman-generator').assert; 6 | var helpers = require('yeoman-generator').test; 7 | var os = require('os'); 8 | 9 | describe('webbp:views', function () { 10 | before(function (done) { 11 | helpers.run(path.join(__dirname, '../views')) 12 | .inDir(path.join(os.tmpdir(), './temp-test')) 13 | .withArguments('name', '--force') 14 | .on('end', done); 15 | }); 16 | 17 | it('creates files', function () { 18 | assert.file([ 19 | 'somefile.js' 20 | ]); 21 | }); 22 | }); 23 | -------------------------------------------------------------------------------- /views/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/views/.DS_Store -------------------------------------------------------------------------------- /views/index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var util = require('util'); 3 | var yeoman = require('yeoman-generator'); 4 | var path = require('path'); 5 | 6 | 7 | var WebbpGenerator = yeoman.generators.NamedBase.extend({ 8 | initializing: function () { 9 | 10 | this.log('You called the aliyun-console subgenerator with the argument ' + this.name + '.'); 11 | }, 12 | 13 | writing: function () { 14 | 15 | 16 | this.sub = []; 17 | var temp = this.name.split('.'); 18 | var rootViewName = this.rootViewName = temp[0]; 19 | var sub = temp.length > 0 && temp.slice(1); 20 | 21 | if(sub && sub.length){ 22 | this.sub = sub; 23 | sub.forEach(function(item){ 24 | this.subViewName = item; 25 | this.template('_subView.js','app/scripts/views/' + rootViewName + '/' + item + '.html'); 26 | }.bind(this)); 27 | } 28 | this.template('_view.js','app/scripts/views/' + rootViewName + '.html'); 29 | } 30 | }); 31 | 32 | module.exports = WebbpGenerator; 33 | -------------------------------------------------------------------------------- /views/templates/.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cc17/generator-webbp/eb2ed66fcb4a71a8d1aa778e0abc00ac60e3dfcc/views/templates/.DS_Store -------------------------------------------------------------------------------- /views/templates/_subView.js: -------------------------------------------------------------------------------- 1 | <%if(subViewName){ %> 2 | <%= subViewName %> 3 | <%}%> 4 | -------------------------------------------------------------------------------- /views/templates/_view.js: -------------------------------------------------------------------------------- 1 | 2 | <%if(rootViewName){ %> 3 | <%= rootViewName %> 4 | 5 |
6 | <%}%> 7 | 8 | 9 | 10 | --------------------------------------------------------------------------------