jiapeng 8 years ago
parent
commit
3434ca5879

+ 5 - 1
css/model/sys/user.css

@ -7,7 +7,7 @@
7 7
    width: 35px;
8 8
}
9 9

10
.sys_user_new {
10
.sys_user_new,.sys_user_role,.sys_user_right,.sys_user_menu {
11 11
    width: 800px;
12 12
    padding: 0 20px 10px;
13 13
}
@ -56,3 +56,7 @@
56 56
	height: 30px;
57 57
	background-color: #3280FC;
58 58
}
59
.sys_user_menu .nav ul{
60
	padding-left: 20px;
61
}
62


+ 72 - 3
html/demo.html

@ -6,6 +6,7 @@
6 6
		<meta http-equiv="X-UA-Compatible" content="IE=edge" />
7 7
		<title></title>
8 8
		<link href="../css/common.css" rel="stylesheet" type="text/css" />
9
		<link href="../ajax/dyn/auth.css" rel="stylesheet" type="text/css" />
9 10
		<style>
10 11
			.page-head {
11 12
				width: 100%;
@ -48,6 +49,7 @@
48 49
				font-size: 15px;
49 50
				color: #fff !important;
50 51
				text-align: center;
52
				position: relative;
51 53
			}
52 54
			
53 55
			.user-info .login-user-head {
@ -88,6 +90,17 @@
88 90
			#g_info {
89 91
				top: 60px;
90 92
			}
93
			
94
			.user-info.dd-ctn .dd-drop {
95
				top: 100%;
96
				z-index: 100;
97
				color: #000000;
98
			}
99
			
100
			.user-info.dd-ctn .dd-drop li {
101
				padding: 5px;
102
				cursor: pointer;
103
			}
91 104
		</style>
92 105
	</head>
93 106

@ -109,8 +122,12 @@
109 122
				<div class="user-msg pull-right">
110 123
					<i class="icon-envelope"></i>
111 124
				</div>
112
				<a class="user-info pull-right"> <img class="login-user-head" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAABuCAIAAABJObGsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzQ0NkMxNDMyMTgxMTFFNTk0NTM4MzgwOUQ4QTlBMjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzQ0NkMxNDQyMTgxMTFFNTk0NTM4MzgwOUQ4QTlBMjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NDQ2QzE0MTIxODExMUU1OTQ1MzgzODA5RDhBOUEyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NDQ2QzE0MjIxODExMUU1OTQ1MzgzODA5RDhBOUEyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkQ1VQMAAA9GSURBVHja7J0Hc9tG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" />
113
					<span class="login-user-name">linux linux</span> <i class="icon-caret-down"></i>
125
				<a class="user-info pull-right dd-ctn "> <img class="login-user-head" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAG4AAABuCAIAAABJObGsAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNiAoV2luZG93cykiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzQ0NkMxNDMyMTgxMTFFNTk0NTM4MzgwOUQ4QTlBMjAiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzQ0NkMxNDQyMTgxMTFFNTk0NTM4MzgwOUQ4QTlBMjAiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo3NDQ2QzE0MTIxODExMUU1OTQ1MzgzODA5RDhBOUEyMCIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NDQ2QzE0MjIxODExMUU1OTQ1MzgzODA5RDhBOUEyMCIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PkQ1VQMAAA9GSURBVHja7J0Hc9tG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" />
126
					<span class="login-user-name dd-hand">linux linux</span> <i class="icon-caret-down"></i>
127
					<ul class="dd-drop">
128
						<li class="opt-user-info-cfg">个人信息设置</li>
129
						<li class="opt-user-menu-cfg">个人菜单设置</li>
130
					</ul>
114 131
				</a>
115 132
			</div>
116 133
		</div>
@ -146,6 +163,7 @@
146 163
	<script type="text/javascript" src="../js/pageDataGrid.js"></script>
147 164
	<script type="text/javascript" src="../js/spa.js"></script>
148 165
	<script type="text/javascript" src="../js/upload.js"></script>
166
	<script type="text/javascript" src="../js/dyn-select.js"></script>
149 167

150 168
	<script>
151 169
		$(function() {
@ -156,13 +174,64 @@
156 174
					if(data.head) {
157 175
						$(".login-user-head").attr("src", "../data/" + data.head);
158 176
					}
159
				},{});
177
				}, {});
160 178
				spa.build();
161 179
				$(".opt-logout").on("click", function() {
162 180
					util.get("../ajax/sys/user/logout", null, function() {
163 181
						window.location.href = "login.html";
164 182
					}, {});
165 183
				});
184
				var g_max_menu_id = 1,
185
					g_m = function(ret, items) {
186
						if(items && items.length) {
187
							var chs = ret.children = [];
188
							items.forEach(function(item) {
189
								var rd = {};
190
								++g_max_menu_id;
191
								rd.code = g_max_menu_id;
192
								rd.caption = item.caption;
193
								if(item.res) {
194
									rd.res = item.res
195
									rd.icon = item.icon || "book";
196
								} else {
197
									rd.icon = item.icon || "branch";
198
								}
199
								if(item.modal) {
200
									rd.modal = true;
201
								}
202
								g_m(rd, item.children);
203
								chs.push(rd);
204
							});
205
						}
206
					}
207
				$(".opt-user-menu-cfg").on("click", function() {
208
					var pData = {},
209
						show = function() {
210
							if(pData.children && pData.reses) {
211
								spa.showModal("sys_user_menu_cfg", pData);
212
							}
213
						};
214

215
					util.get("../ajax/user/config/menu", null, function(data) {
216
						g_m(pData, data);
217
						show();
218
					});
219
					util.get("../ajax/sys/resource/user", null, function(data) {
220
						var reses = pData.reses = [];
221
						data.forEach(function(item) {
222
							if(item.main) {
223
								var rd = { code: item.id, caption: item.name, enabled: true };
224
								reses.push(rd);
225
							}
226
						});
227
						show();
228
					});
229

230
				});
231
				$(".opt-user-info-cfg").on("click", function() {
232

233
					util.alert("修改个人信息");
234
				});
166 235

167 236
			});
168 237
		});

+ 55 - 0
html/model/sys/user/menu.html

@ -0,0 +1,55 @@
1
<div class="sys_user_menu centerModal">
2
	<div class="modal-ctrl">
3
		<i class="icon icon-times"></i>
4
	</div>
5
	<div class="main row">
6
		<div class="nav col-5">
7

8
		</div>
9
		<div class="info col-7">
10
			<div class="info-edit container">
11
				<div class="row">
12
					<div class="col-4 item-caption">标题</div>
13
					<div class="col-8">
14
						<div class="form-item text" name="caption"></div>
15
					</div>
16
				</div>
17
				<div class="row">
18
					<div class="col-4 item-caption">资源</div>
19
					<div class="col-8">
20
						<div class="form-item dyn-select" name="res"></div>
21
					</div>
22
				</div>
23
				<div class="row">
24
					<div class="col-4 item-caption">ICON</div>
25
					<div class="col-8">
26
						<div class="form-item text" name="icon"></div>
27
					</div>
28
				</div>
29
				
30
				<div class="row">
31
					<div class="col-12">
32
						<div class="btn opt-ok pull-right">确定</div>
33
						<div class="btn opt-del pull-right">删除</div>
34
						<div class="btn opt-next pull-right">下移</div>
35
						<div class="btn opt-prev pull-right">上移</div>
36
						<div class="btn opt-new pull-right">新建</div>
37

38
					</div>
39
				</div>
40
			</div>
41
		</div>
42
	</div>
43
	<div class=" container btns">
44
		<div class="row ">
45
			<div class="col-12">
46
				<div class="btn opt-newroot pull-left">
47
					NEW
48
				</div>
49
				<div class="btn opt-save pull-right">
50
					Save
51
				</div>
52
			</div>
53
		</div>
54
	</div>
55
</div>

+ 41 - 0
html/model/sys/user/right.html

@ -0,0 +1,41 @@
1
<div class="sys_user_right centerModal">
2
	<div class="modal-ctrl">
3
		<i class="icon icon-times"></i>
4
	</div>
5
	<div class="containe">
6
		<div class="row">
7
			<div class="col-6">
8
				<div class="container newForm">
9
					<div class="row">
10
						<div class="col-4 item-caption ">name</div>
11
						<div class="col-8">
12
							<div class="form-item text showOnly"  name="name"></div>
13
						</div>
14
					</div>
15
					<div class="row">
16
						<div class="col-4 item-caption">mobile</div>
17
						<div class="col-8">
18
							<div class="form-item text showOnly" name="mobile"></div>
19
						</div>
20
					</div>
21
					<div class="row">
22
						<div class="col-4 item-caption">email</div>
23
						<div class="col-8">
24
							<div class="form-item text showOnly" name="email"></div>
25
						</div>
26
					</div>
27
				</div>
28
			</div>
29
			<div class="col-6">
30
				<ul class ="right-ctn">
31
					<li ch-dir="list" class="right-item opt-check"><i class="icon icon-st-check {{checked}}" right="{{id}}"></i>&nbsp;&nbsp;&nbsp;{{name}}</li>
32
				</ul>
33
			</div>
34
		</div>
35
		<div class="row">
36
			<div class="col-12">
37
				<div class="btn opt-save pull-right">SAVE</div>
38
			</div>
39
		</div>
40
	</div>
41
</div>

+ 41 - 0
html/model/sys/user/role.html

@ -0,0 +1,41 @@
1
<div class="sys_user_role centerModal">
2
	<div class="modal-ctrl">
3
		<i class="icon icon-times"></i>
4
	</div>
5
	<div class="containe">
6
		<div class="row">
7
			<div class="col-6">
8
				<div class="container newForm">
9
					<div class="row">
10
						<div class="col-4 item-caption ">name</div>
11
						<div class="col-8">
12
							<div class="form-item text showOnly"  name="name"></div>
13
						</div>
14
					</div>
15
					<div class="row">
16
						<div class="col-4 item-caption">mobile</div>
17
						<div class="col-8">
18
							<div class="form-item text showOnly" name="mobile"></div>
19
						</div>
20
					</div>
21
					<div class="row">
22
						<div class="col-4 item-caption">email</div>
23
						<div class="col-8">
24
							<div class="form-item text showOnly" name="email"></div>
25
						</div>
26
					</div>
27
				</div>
28
			</div>
29
			<div class="col-6">
30
				<ul class ="role-ctn">
31
					<li ch-dir="list" class="role-item opt-check"><i class="icon icon-st-check {{checked}}" roleid="{{id}}"></i>&nbsp;&nbsp;&nbsp;{{name}}</li>
32
				</ul>
33
			</div>
34
		</div>
35
		<div class="row">
36
			<div class="col-12">
37
				<div class="btn opt-save pull-right">SAVE</div>
38
			</div>
39
		</div>
40
	</div>
41
</div>

+ 40 - 0
js/dict.js

@ -19,6 +19,19 @@ $.define(["jQuery", "util"], "dict", function($, util) {
19 19
				set(code, data);
20 20
			}, eh, config);
21 21
		},
22
		dyn_load=function(obj){
23
			util.get(obj.uri, null, function(data) {
24
			obj.ready=true;
25
			obj.items =obj.transfer?obj.transfer(data):data;
26
			if(obj.listen){
27
				obj.listen.forEach(function(item){
28
					item.call(null,obj.items);
29
				});
30
			}
31
			delete obj.listen;
32
			}, obj.ajaxEh, obj.ajaxCfg);
33
		}
34
		
22 35
		apply = function(code, hand) {
23 36
			var dict = cache[code];
24 37
			if(!dict) {
@ -32,6 +45,19 @@ $.define(["jQuery", "util"], "dict", function($, util) {
32 45
				hand(dict);
33 46
			}
34 47
		},
48
		
49
		dyn_apply=function(obj,hand){
50
			if(!obj.ready) {
51
				var hs = obj.listen;
52
				if(!hs) {
53
					obj.listen = hs = [];
54
					dyn_load(obj);
55
				}
56
				hs.push(hand);
57
			} else {
58
				hand(obj.items);
59
			}
60
		},
35 61
		refresh = function(code, hand) {
36 62
			if(hand) {
37 63
				var hs = handCache[code];
@ -65,6 +91,7 @@ $.define(["jQuery", "util"], "dict", function($, util) {
65 91
		ret = {
66 92
			set: set,
67 93
			apply: apply,
94
			dynApply:dyn_apply,
68 95
			refresh: refresh,
69 96
			getCap: getCap,
70 97
			get: get,
@ -82,6 +109,19 @@ $.define(["jQuery", "util"], "dict", function($, util) {
82 109
					});
83 110
				}
84 111
			},
112
			dynTransfer:function(obj,$e,code){
113
				code = code || $e.attr("code") || $e.attr("itemCode");
114
				if(code){
115
					dyn_apply(obj,function(items){
116
						var cp = getCap(items, code);
117
						if(cp) {
118
							$e.removeClass("invalid-dict").text(cp);
119
						} else {
120
							$e.addClass("invalid-dict").text("不可翻译的");
121
						}
122
					});
123
				}
124
			},
85 125
			doTransfer: function() {
86 126
				$(".hand-dict").each(function() {
87 127
					var $e = $(this);

+ 349 - 0
js/dyn-select.js

@ -0,0 +1,349 @@
1
$.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, doc, util, dd, dict) {
2
	var readOnly = "readOnly",
3
		showOnly = "showOnly",
4
		modelName = 'dyn-select',
5
		mModelName = "dyn-mselect",
6
		tInt = "int",
7
		def = "defVal",
8
		placeholder = "placeholder",
9
		required = "required",
10

11
		tree = "tree",
12
		queried = "queried",
13
		handCode = { an: "code", av: "" },
14
		spanCode = { an: "code", av: "" },
15
		pa = [""],
16
		jhref = { an: "href", av: "javascript:;" },
17
		dd_hand = { an: "class", av: "dd-hand" },
18
		icon_drop = { tn: "i", attrs: [{ an: "class", av: "icon icon-drop" }] },
19
		icon_close = { tn: "i", attrs: [{ an: "class", av: "icon icon-close" }] },
20
		a_placeHolder = { tn: "a", attrs: [jhref, { an: "class", av: placeholder }], chs: pa },
21
		hand = {
22
			tn: "a",
23
			attrs: [
24
				dd_hand,
25
				jhref,
26
				handCode,
27
			],
28
			chs: [
29
				icon_drop,
30
				{ tn: "span", attrs: [spanCode] },
31
				icon_close,
32
				a_placeHolder,
33
			]
34
		},
35
		seim = { an: "class", av: "select-item" },
36
		sebi = { an: "class", av: "branch-item" },
37
		buildTreeDrop = function(isQueried, items, pa) {
38
			items.forEach(function(item) {
39
				if(isQueried || item.enabled) {
40
					var li = {
41
						tn: "li",
42
						attrs: [{ an: "code", av: item.code }, { an: "caption", av: item.caption }],
43
						chs: []
44
					};
45
					if(item.children && item.children.length) {
46
						var bhand = {
47
							tn: "a",
48
							attrs: [{ an: "code", av: item.code }],
49
							chs: [{ tn: "span", chs: [item.caption] }]
50
						};
51
						li.attrs.push(sebi);
52
						li.chs.push(bhand);
53
						var ul = { tn: "ul", chs: [] };
54
						li.chs.push(ul);
55
						buildTreeDrop(isQueried, item.children, ul.chs);
56
					} else {
57
						li.attrs.push(seim);
58
						li.chs.push(item.caption);
59
					}
60
					pa.push(li);
61
				}
62
			});
63
		},
64
		buildShown = function($e, cache, clss) {
65
			return clss[tree] ? function(evt) {
66
				var items = cache.ready ? cache.items : null;
67
				var drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop" }], chs: [] };
68
				if(items) {
69
					var ul = { tn: "ul", chs: [] };
70
					buildTreeDrop(clss[queried], items, ul.chs);
71
					drop.chs.push(ul);
72
				} else {
73
					drop.chs.push("loading.........");
74
				}
75
				util.appendChild($e[0], drop);
76
			} : function(evt) {
77
				var items = cache.ready ? cache.items : null;
78
				var drop = { tn: "div", attrs: [{ an: "class", av: "dd-drop" }], chs: [] };
79
				if(items) {
80
					var ul = { tn: "ul", chs: [] };
81
					items.forEach(function(item) {
82
						if(clss[queried] || item.enabled) {
83
							this.push({
84
								tn: "li",
85
								attrs: [seim, { an: "code", av: item.code }, { an: "caption", av: item.caption }],
86
								chs: [item.caption]
87
							});
88
						}
89
					}, ul.chs);
90
					drop.chs.push(ul);
91
				} else {
92
					drop.chs.push("loading.........");
93
				}
94
				util.appendChild($e[0], drop);
95
			};
96
		};
97

98
	form.register(function($e, options) {
99
		var cls = util.classCheck($e[0], [readOnly, showOnly, modelName, tInt, required, tree, queried]),
100
			rv, dynCache = {};
101
		if(cls[modelName]) {
102
			var n = $e.attr("name") || $e.attr("id"),
103
				ve, rules = [];
104
			if(!n) {
105
				throw "Attribute[name] is invalid";
106
			}
107
			var dv = $e.attr(def) || "",
108
				dynUri = $e.attr("uri") || "";
109
			rv = dv;
110
			$.extend(dynCache, options[n] || {});
111
			if(dynUri) {
112
				dynCache.uri = dynUri;
113
			}
114
			$e.empty().addClass("dd-ctn").addClass("dd-clean");
115
			handCode.av = spanCode.av = dv;
116
			pa[0] = $e.attr(placeholder) || "请选择......";
117
			util.appendChild($e[0], hand);
118
			var $h = $e.children("a");
119
			var $span = $h.children("span");
120
			var select_change = function(nv, cap, evt) {
121
				if(rv != nv) {
122
					rv = nv;
123
					$h.attr("code", rv);
124
					$span.attr("code", rv).text(cap).removeClass("invalid-dict");
125
					if(evt) {
126
						$e.addClass("dd-hold-once");
127
					}
128
				}
129
			};
130
			if(!(cls[readOnly] || cls[showOnly])) {
131
				$e.on("shown.dropdown", buildShown($e, dynCache, cls));
132
				$e.find(".icon-close").on("click", function(evt) {
133
					select_change("", "", evt);
134
				});
135
				$e.on("click", "div .select-item", function() {
136
					select_change(this.getAttribute("code"), this.getAttribute("caption"));
137
				});
138
				if(cls[tree]) {
139
					$e.on("click", "div .branch-item>a", function(evt) {
140
						$(this).toggleClass("open");
141
						$e.addClass("dd-hold-once");
142
					});
143
				}
144
			}
145
			if(rv) {
146
				dict.dynTransfer(dynCache, $span, rv);
147
			} else {
148
				dict.dynApply(dynCache, util.noop);
149
			}
150
			return {
151
				name: n,
152
				get: function() {
153
					if((!cls[showOnly]) && rv) {
154
						return cls[tInt] ? parseInt(rv) : rv;
155
					}
156
				},
157
				set: function(data) {
158
					if(data) {
159
						var cc = data === true ? "1" : ("" + data);
160
						select_change(cc, "");
161
						dict.dynTransfer(dynCache, $span, cc);
162
					} else if(data === false || data === 0) {
163
						select_change("0", "");
164
						dict.dynTransfer(dynCache, $span, cc);
165
					} else {
166
						select_change("", "");
167
					}
168
				},
169
				validate: function() {
170
					if(cls[required]) {
171
						if(!rv) {
172
							return "不可为空";
173
						}
174
					}
175
					return util.validate(rules, this);
176
				},
177
				addRules: function(rule) {
178
					util.addRules(rules, rule);
179
				},
180
				reset: function() {
181
					this.set(dv);
182
				},
183
				valid: function() { util.valid($e); },
184
				invalid: function(reson) {
185
					util.invalid($e);
186
					util.error(reson);
187
				}
188
			};
189
		}
190

191
	});
192
	var selCap = { an: "class", av: "select-caption" },
193
		mhand = {
194
			tn: "a",
195
			attrs: [dd_hand],
196
			chs: [icon_drop, { tn: "ul" }, a_placeHolder]
197
		};
198
	form.register(function($e, options) {
199
		var cls = util.classCheck($e[0], [readOnly, showOnly, mModelName, tInt, required, tree, queried]);
200
		if(cls[mModelName]) {
201
			var n = $e.attr("name") || $e.attr("id"),
202
				rules = [];
203
			if(!n) {
204
				throw "Attribute[name] is invalid";
205
			}
206
			var dv = [],
207
				rv = [],
208
				dynCache = {},
209
				tmp = ($e.attr(def) || "").split(","),
210
				dynUri = $e.attr("uri") || "";
211
			$.extend(dynCache, options[n] || {});
212
			if(dynUri) {
213
				dynCache.uri = dynUri;
214
			}
215
			tmp.forEach(function(item) {
216
				if(item) {
217
					item = item.trim();
218
					if(item) {
219
						dv.push(item);
220
						rv.push(item);
221
					}
222
				}
223
			});
224
			$e.empty().addClass("dd-ctn").addClass("dd-clean");
225
			pa[0] = $e.attr(placeholder) || "请选择......";
226
			var lis = mhand.chs[1].chs = [];
227
			dv.forEach(function(item) {
228
				lis.push({
229
					tn: "li",
230
					attrs: [{ an: "code", av: item }],
231
					chs: [icon_close, { tn: "span", attrs: [{ an: "code", av: item }, selCap] }]
232
				});
233
			});
234
			util.appendChild($e[0], mhand);
235

236
			var $ul = $e.find("ul");
237
			var mselect_add = function(nv, cp) {
238
				if(rv.indexOf(nv) > -1) {
239
					return false;
240
				}
241
				rv.push(nv);
242
				var li = {
243
					tn: "li",
244
					attrs: [{ an: "code", av: nv }],
245
					chs: [icon_close,
246
						{
247
							tn: "span",
248
							attrs: [{ an: "code", av: nv }, selCap],
249
							chs: [cp]
250
						}
251
					]
252
				};
253
				util.appendChild($ul[0], li);
254
				return true;
255
			};
256
			var mselect_change = function(na) {
257
				rv = [], nlis = [];
258
				$ul.empty();
259
				na.forEach(function(item) {
260
					rv.push("" + item);
261
				});
262
				if(rv.length) {
263
					rv.forEach(function(item) {
264
						nlis.push({
265
							tn: "li",
266
							attrs: [{ an: "code", av: nv }, selCap],
267
							chs: [icon_close, {
268
								tn: "span",
269
								attrs: [{ an: "code", av: item.code }, { an: "class", av: "hand-dyn-dict" }]
270
							}]
271
						});
272
					});
273
					util.appendChild($ul[0], nlis);
274
					dict.doTransfer();
275
					$ul.find(".hand-dyn-dict").each(function() {
276
						var $this = $(this);
277
						dict.dynTransfer(dynCache, $this);
278
						$this.removeClass("hand-dyn-dict");
279
					});
280
				}
281
			};
282
			if(lis.length) {
283
				$ul.find("span").each(function() {
284
					dict.dynTransfer(dynCache,$(this));
285
				});
286
			} else {
287
				dict.dynApply(dynCache, util.noop);
288
			}
289

290
			if(!(cls[readOnly] || cls[showOnly])) {
291
				$e.on("shown.dropdown", buildShown($e, dictCode, cls));
292
				$ul.on("click", "li>i", function(e) {
293
					$e.addClass("dd-hold-one");
294
					var idx = rv.indexOf(this.parentNode.getAttribute("code"));
295
					if(idx > -1) {
296
						rv.splice(idx, 1);
297
					}
298
					$(this).parent().remove();
299
				});
300
				$e.on("click", "div .select-item", function() {
301
					if(!mselect_add(this.getAttribute("code"), this.getAttribute("caption"))) {
302
						$e.addClass("dd-hold-once");
303
					}
304
				});
305
				if(cls[tree]) {
306
					$e.on("click", "div .branch-item>a", function(evt) {
307
						$(this).toggleClass("open");
308
						$e.addClass("dd-hold-once");
309
					});
310
				}
311
			}
312

313
			return {
314
				name: n,
315
				get: function() {
316
					if((!cls[showOnly]) && rv.length) {
317
						var ret = [];
318
						rv.forEach(function(item) {
319
							ret.push(cls[tInt] ? parseInt(item) : item);
320
						});
321
						return ret;
322
					}
323
				},
324
				set: function(data) {
325
					mselect_change(data ? (data.length ? data : []) : []);
326
				},
327
				validate: function() {
328
					if(cls[required]) {
329
						if(!rv.length) {
330
							return "不可为空";
331
						}
332
					}
333
					return util.validate(rules, this);
334
				},
335
				addRules: function(rule) {
336
					util.addRules(rules, rule);
337
				},
338
				reset: function(data) {
339
					this.set(dv);
340
				},
341
				valid: function() { util.valid($e); },
342
				invalid: function(reson) {
343
					util.invalid($e);
344
					util.error(reson);
345
				}
346
			};
347
		}
348
	});
349
});

+ 2 - 2
js/form.js

@ -37,14 +37,14 @@ $.define(["jQuery", "util"], "form", function($, util) {
37 37
		},
38 38
		serialize=util.serialize,
39 39
		/* create form instance by jQuery obj */
40
		bf = function($e) {
40
		bf = function($e,itemOptions) {
41 41
			if($e.length === 1) {
42 42
				var items = {},
43 43
					rules = [];
44 44
				$e.find(".form-item").each(function() {
45 45
					var $this = $(this);
46 46
					for(var i = 0; i < impls.length; ++i) {
47
						var item = impls[i]($this);
47
						var item = impls[i]($this,itemOptions);
48 48
						if(item && item.name) {
49 49
							items[item.name] = item;
50 50
						}

+ 1 - 1
js/model/sys/dict/itemedit.js

@ -43,7 +43,7 @@ spa_define(function() {
43 43
							li.attrs[0].av = "branch-item";
44 44
							var cul = { tn: "ul", chs: [] };
45 45
							chs.push(cul);
46
							paint(cul, item.children);
46
							paint(cul, item.children,item.code);
47 47
						}
48 48
					});
49 49
				};

+ 73 - 1
js/model/sys/user/index.js

@ -30,7 +30,7 @@ spa_define(function() {
30 30
						if($org.length > 1) {
31 31
							util.alertMsg("只能选择一个用户");
32 32
						} else {
33
							$.util.get("../ajax/sys/user/id/" + $org.attr("userId"), null, function(rd) {
33
							util.get("../ajax/sys/user/id/" + $org.attr("userId"), null, function(rd) {
34 34
								if(rd) {
35 35
									spa.showModal("sys_user_edit", { data: rd, hand: function() { pdg.load() } })
36 36
								} else {
@ -65,6 +65,78 @@ spa_define(function() {
65 65
						util.alert("请选择一个用户");
66 66
					}
67 67
				});
68
				root.find(".opt-role").on("click", function() {
69
					var $user = root.find("td.opt-check>i.checked");
70
					if($user.length) {
71
						if($user.length > 1) {
72
							util.alert("只能选择一个用户");
73
						} else {
74
							var ud = {
75
									id: $user.attr("userId"),
76
									name: $user.parent().parent().children(".data-name").text(),
77
									mobile: $user.parent().parent().children(".data-mobile").text(),
78
									email: $user.parent().parent().children(".data-email").text(),
79
									userRoles: null,
80
									roles: null
81
								},
82
								sm = function() {
83
									if(ud.userRoles && ud.roles) {
84
										spa.showModal("sys_user_role", ud);
85
									}
86
								};
87
							util.get("../ajax/sys/role/all", null, function(rd) {
88
								ud.roles = rd;
89
								sm();
90
							});
91
							util.get("../ajax/sys/userRole/user/" + ud.id, null, function(rd) {
92
								if(rd) {
93
									ud.userRoles = rd;
94
									sm();
95
								} else {
96
									util.alert("用户不存在了");
97
								}
98
							});
99
						}
100
					} else {
101
						util.alert("请选择一个用户");
102
					}
103
				});
104
				root.find(".opt-right").on("click", function() {
105
					var $user = root.find("td.opt-check>i.checked");
106
					if($user.length) {
107
						if($user.length > 1) {
108
							util.alert("只能选择一个用户");
109
						} else {
110
							var ud = {
111
									id: $user.attr("userId"),
112
									name: $user.parent().parent().children(".data-name").text(),
113
									mobile: $user.parent().parent().children(".data-mobile").text(),
114
									email: $user.parent().parent().children(".data-email").text(),
115
									userRights: null,
116
									rights: null
117
								},
118
								sm = function() {
119
									if(ud.userRights && ud.rights) {
120
										spa.showModal("sys_user_right", ud);
121
									}
122
								};
123
							util.get("../ajax/sys/right/all", null, function(rd) {
124
								ud.rights = rd;
125
								sm();
126
							});
127
							util.get("../ajax/sys/user/right/" + ud.id, null, function(rd) {
128
								if(rd) {
129
									ud.userRights = rd;
130
									sm();
131
								} else {
132
									util.alert("用户不存在了");
133
								}
134
							});
135
						}
136
					} else {
137
						util.alert("请选择一个用户");
138
					}
139
				});
68 140
				pdg.load();
69 141

70 142
			},

+ 241 - 0
js/model/sys/user/menu.js

@ -0,0 +1,241 @@
1
;
2
spa_define(function() {
3
	return $.use(["util", "form", "dict", "spa", "code", "form"], function(util, form, dict, spa, code, form) {
4
		var ahref = { an: "href", av: "javascript:;" };
5
		return {
6
			modal: function(data) {
7
				var root = spa.findInModal(".sys_user_menu"),
8
					g_max_menu_code = 1;
9
				root.find(".modal-ctrl .icon-times").on("click", function() {
10
					spa.closeModal();
11
				});
12
				var treeCnt = root.find(".main .nav"),
13
					menuData = data.children,
14
					reses = data.reses;
15
				hand = code.parseCode(root.find(".info")),
16
					editForm = {};
17

18
				var findByCode = function(c, items) {
19
					var ret;
20
					for(var i = 0; i < items.length; ++i) {
21
						var item = items[i];
22
						if(item.code === c) return item;
23
						if(item.children && item.children.length) {
24
							ret = findByCode(c, item.children);
25
							if(ret) return ret;
26
						}
27
					}
28
				};
29
				var paint = function(ul, items, pc) {
30
					items.forEach(function(item) {
31
						if(item.code > g_max_menu_code) {
32
							g_max_menu_code = item.code;
33
						}
34
						var li = { tn: "li" },
35
							attrs = li.attrs = [{ an: "class", av: "leaf-item" }];
36
						chs = li.chs = [];
37
						ul.chs.push(li);
38
						attrs.push({ an: "code", av: item.code });
39
						attrs.push({ an: "pcode", av: pc || "" });
40
						var icon = {
41
							tn: "i",
42
							attrs: [{ an: "class", av: "icon icon-" + item.icon }]
43
						};
44
						chs.push(icon);
45
						chs.push({ tn: "a", attrs: [ahref], chs: [item.caption] });
46
						if(item.children && item.children.length) {
47
							li.attrs[0].av = "branch-item";
48
							var cul = { tn: "ul", chs: [] };
49
							chs.push(cul);
50
							paint(cul, item.children, item.code);
51
						}
52
					});
53
				};
54
				var refreshTree = function() {
55
					var ul = { tn: "ul", chs: [] };
56
					paint(ul, menuData);
57
					treeCnt.empty();
58
					util.appendChild(treeCnt[0], ul);
59
					hand.empty();
60
					editForm.oc = null;
61
					editForm.pc = null;
62
					editForm.form = null;
63
				};
64
				var findParentArray = function(pc) {
65
					if(pc) {
66
						var items = findByCode(pc, menuData);
67
						return items ? (items.children ? items.children : null) : null;
68
					}
69
					return menuData;
70
				};
71
				var movePrev = function() {
72
					if(editForm.oc) {
73
						var items = findParentArray(editForm.pc);
74
						if(items) {
75
							var i = 0;
76
							for(; i < items.length; ++i) {
77
								if(items[i].code === editForm.oc) {
78
									break;
79
								}
80
							}
81
							if(i > 0 && i < items.length) {
82
								var item1 = items[i],
83
									item0 = items[i - 1];
84
								items.splice(i - 1, 2, item1, item0);
85
								refreshTree();
86
							}
87
						}
88
					}
89
				};
90
				var moveNext = function() {
91
					if(editForm.oc) {
92
						var items = findParentArray(editForm.pc);
93
						if(items) {
94
							var i = 0;
95
							for(; i < items.length; ++i) {
96
								if(items[i].code === editForm.oc) {
97
									break;
98
								}
99
							}
100
							if(i < (items.length - 1)) {
101
								var item1 = items[i],
102
									item0 = items[i + 1];
103
								items.splice(i, 2, item0, item1);
104
								refreshTree();
105
							}
106
						}
107
					}
108
				};
109
				var deleteItem = function(pc, oc) {
110
					if(editForm.oc) {
111
						var items = findParentArray(editForm.pc);
112
						if(items) {
113
							var i = 0;
114
							for(; i < items.length; ++i) {
115
								if(items[i].code === editForm.oc) {
116
									break;
117
								}
118
							}
119
							if(i < items.length) {
120
								items.splice(i, 1);
121
								refreshTree();
122
							}
123
						}
124
					}
125
				};
126

127
				var fillEdit = function(pc, di) {
128
					if(pc && typeof pc === "string") {
129
						pc = parseInt(pc);
130
					}
131
					hand.val();
132
					editForm.form = form.build(root.find(".info"), { res: { ready: true, items: reses } });
133
					editForm.pc = pc;
134
					editForm.oc = di.code;
135
					editForm.form.val(di);
136
				};
137

138
				root.on("click", ".nav li", function(evt) {
139
					var $this = $(this);
140
					if($this.hasClass("branch-item")) {
141
						$this.toggleClass("open");
142
					}
143
					var di = findByCode(parseInt($this.attr("code")), menuData);
144
					if(di) {
145
						fillEdit($this.attr("pcode"), di);
146
					}
147
					evt.stopPropagation();
148
				});
149
				root.on("click", ".opt-newroot", function() {
150
					fillEdit("", {});
151
				});
152
				root.on("click", ".opt-new", function() {
153
					fillEdit(editForm.oc, {});
154
				});
155
				root.on("click", ".opt-prev", function() {
156
					movePrev();
157
				});
158
				root.on("click", ".opt-next", function() {
159
					moveNext();
160
				});
161
				root.on("click", ".opt-del", function() {
162
					deleteItem();
163
				});
164
				root.on("click", ".opt-ok", function() {
165
					if(editForm.form.validate()) {
166
						var item = editForm.form.val();
167
						if(editForm.oc) {
168
							di = findByCode(editForm.oc, menuData);
169
							if(di) {
170
								di.caption = item.caption;
171
								di.modal = false;
172
								if(item.res) {
173
									di.res = item.res;
174
									di.icon = item.icon || "book";
175
								} else {
176
									di.res = null;
177
									di.icon = item.icon || "branch";
178
								}
179
								refreshTree();
180
							}
181
						} else {
182
							var items = menuData;
183
							if(editForm.pc) {
184
								items = findByCode(editForm.pc, menuData);
185
								if(items) {
186
									if(items.children) {
187
										items = items.children;
188
									} else {
189
										items = items.children = [];
190
									}
191
								} else {
192
									items = menuData;
193
								}
194
							}
195
							++g_max_menu_code;
196
							var di = { code: g_max_menu_code, caption: item.caption, modal: false };
197
							if(item.res) {
198
								di.res = item.res;
199
								di.icon = item.icon || "book";
200
							} else {
201
								di.res = null;
202
								di.icon = item.icon || "branch";
203
							}
204
							items.push(di);
205
							refreshTree();
206
						}
207
					}
208
				});
209
				var cloneMenu = function(src, dest) {
210
					src.forEach(function(item) {
211
						var di = {};
212
						di.icon = item.icon;
213
						if(item.res) {
214
							di.res = item.res;
215
						}
216
						di.modal = false;
217
						di.caption = item.caption;
218
						dest.push(di);
219
						if(item.children && item.children.length) {
220
							var chs = di.children = [];
221
							cloneMenu(item.children, chs);
222
						}
223
					});
224
				}
225
				root.find(".opt-save").on("click", function() {
226
					var pd = [];
227
					cloneMenu(menuData,pd);
228
					util.put("../ajax/user/config/menu", pd, function() {
229
						spa.closeModal();
230
						if(data.hand) {
231
							data.hand();
232
						}
233
					}, {});
234
				});
235

236
				refreshTree();
237

238
			}
239
		};
240
	});
241
});

+ 37 - 0
js/model/sys/user/right.js

@ -0,0 +1,37 @@
1
;
2
spa_define(function() {
3
	return $.use(["spa", "form", "code","util"], function(spa, fb, code,util) {
4
		return {
5
			modal: function(data) {
6
				var userid = data.id;
7
				var root = spa.findInModal(".sys_user_right");
8
				var form = fb.build(root.find(".newForm"));
9
				var cr = code.parseCode(root.find(".right-ctn"));
10
				root.find(".modal-ctrl .icon-times").on("click", function() {
11
					spa.closeModal();
12
				});
13
				root.on("click", ".icon-st-check", function() {
14
					$(this).toggleClass("checked");
15
				});
16

17
				root.find(".opt-save").on("click", function() {
18
					var ret = [];
19
					root.find(".right-ctn i.checked").each(function() {
20
						ret.push(parseInt($(this).attr("right")));
21
					});
22
					util.post("../ajax/sys/user/right",{userid:userid,right:ret},function(){
23
						spa.closeModal();
24
					});
25
				});
26
				data.rights.forEach(function(item){
27
					item.checked = (data.userRights.indexOf(item.id)>=0)?"checked":"";
28
					
29
				});
30
				cr.val(data.rights);
31
				form.val({name:data.name,mobile:data.mobile,email:data.email});
32
				
33
			}
34
		};
35
	});
36

37
});

+ 37 - 0
js/model/sys/user/role.js

@ -0,0 +1,37 @@
1
;
2
spa_define(function() {
3
	return $.use(["spa", "form", "code","util"], function(spa, fb, code,util) {
4
		return {
5
			modal: function(data) {
6
				var userid = data.id;
7
				var root = spa.findInModal(".sys_user_role");
8
				var form = fb.build(root.find(".newForm"));
9
				var cr = code.parseCode(root.find(".role-ctn"));
10
				root.find(".modal-ctrl .icon-times").on("click", function() {
11
					spa.closeModal();
12
				});
13
				root.on("click", ".icon-st-check", function() {
14
					$(this).toggleClass("checked");
15
				});
16

17
				root.find(".opt-save").on("click", function() {
18
					var ret = [];
19
					root.find(".role-ctn i.checked").each(function() {
20
						ret.push($(this).attr("roleid"));
21
					});
22
					util.post("../ajax/sys/userRole",{userid:userid,role:ret},function(){
23
						spa.closeModal();
24
					});
25
				});
26
				data.roles.forEach(function(item){
27
					item.checked = (data.userRoles.find(function(role){return role.roleid==item.id})?"checked":"");
28
					
29
				});
30
				cr.val(data.roles);
31
				form.val({name:data.name,mobile:data.mobile,email:data.email});
32
				
33
			}
34
		};
35
	});
36

37
});

+ 1 - 2
js/select.js

@ -261,8 +261,7 @@ $.use(["jQuery", "form", "doc", "util", "dropdown", "dict"], function($, form, d
261 261
							attrs: [{ an: "code", av: nv },selCap],
262 262
							chs: [icon_close, {
263 263
								tn: "span",
264
								attrs: [{ an: "code", av: item.code }, { an: "dict", av: dictCode }, { an: "class", av: "hand-dict" }],
265
								chs: [cp]
264
								attrs: [{ an: "code", av: item.code }, { an: "dict", av: dictCode }, { an: "class", av: "hand-dict" }]
266 265
							}]
267 266
						});
268 267
					});

+ 1 - 1
js/spa.js

@ -86,7 +86,7 @@ $.define(["jQuery", "util", "doc", "win", "body"], "spa", function($, util, doc,
86 86
					attrs.push({ an: "class", av: "nav-parent" });
87 87
					var ul = { tn: "ul", attrs: [{ an: "class", av: "nav" }], chs: [] };
88 88
					chses.push(ul);
89
					build_menu_item(ul, item.children);
89
					build_menu_item(ul.chs, item.children);
90 90
				}
91 91
				lia.attrs.push({ an: "class", av: lac });
92 92
				po.push(li);