├── .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 [](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 [](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 |
24 | -
25 | home
26 |
27 | -
28 | view1
29 |
30 |
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">' + cellTag + '>';
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 = '';
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 [](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 [](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 |
--------------------------------------------------------------------------------