educode_sales 0.9.68 → 0.9.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/educode_sales/indexlogo.png +0 -0
  3. data/app/assets/javascripts/educode_sales/extent/treeTable.js +235 -0
  4. data/app/controllers/educode_sales/customers_controller.rb +107 -0
  5. data/app/controllers/educode_sales/follow_ups_controller.rb +6 -0
  6. data/app/controllers/educode_sales/projects_controller.rb +420 -0
  7. data/app/controllers/educode_sales/roles_controller.rb +4 -1
  8. data/app/controllers/educode_sales/teachers_controller.rb +38 -13
  9. data/app/helpers/educode_sales/application_helper.rb +1 -0
  10. data/app/models/educode_sales/business.rb +21 -5
  11. data/app/models/educode_sales/business_history.rb +8 -0
  12. data/app/models/educode_sales/permission.rb +2 -1
  13. data/app/models/educode_sales/project.rb +53 -0
  14. data/app/models/educode_sales/role_area.rb +2 -1
  15. data/app/views/educode_sales/activities/show_teachers.html.erb +1 -1
  16. data/app/views/educode_sales/businesses/index.html.erb +5 -0
  17. data/app/views/educode_sales/businesses/index.json.jbuilder +3 -0
  18. data/app/views/educode_sales/businesses/time_line.html.erb +9 -5
  19. data/app/views/educode_sales/customers/edit_major.html.erb +872 -0
  20. data/app/views/educode_sales/customers/list.html.erb +602 -0
  21. data/app/views/educode_sales/customers/list.json.jbuilder +33 -0
  22. data/app/views/educode_sales/follow_ups/index.json.jbuilder +2 -2
  23. data/app/views/educode_sales/projects/detail.html.erb +269 -0
  24. data/app/views/educode_sales/projects/edit.html.erb +246 -0
  25. data/app/views/educode_sales/projects/history.html.erb +41 -0
  26. data/app/views/educode_sales/projects/index.html.erb +688 -0
  27. data/app/views/educode_sales/projects/index.json.jbuilder +69 -0
  28. data/app/views/educode_sales/teachers/_index.html.erb +17 -1
  29. data/app/views/educode_sales/teachers/index.json.jbuilder +2 -0
  30. data/app/views/layouts/educode_sales/application.html.erb +25 -0
  31. data/config/routes.rb +12 -0
  32. data/db/migrate/20230411134203_add_realname_to_teacher.rb +5 -0
  33. data/db/migrate/20230412083510_add_p_staff_id_to_businesses.rb +20 -0
  34. data/db/migrate/20230412092000_create_business_histories.rb +10 -0
  35. data/db/migrate/20230413015619_add_permissions_to_projects.rb +11 -0
  36. data/db/migrate/20230413031029_add_pre_time_to_businesses.rb +5 -0
  37. data/lib/educode_sales/version.rb +1 -1
  38. metadata +24 -6
@@ -0,0 +1,872 @@
1
+ <div class="layui-form layuimini-form " id="custom_data" data-required="true">
2
+ <div class="layui-form-item" style="padding: 25px">
3
+ <div class="layui-inline">
4
+ <label class="layui-form-label required">客户:</label>
5
+ <div class="layui-input-block" style="width: 500px;">
6
+ <input type="text" name="name" required lay-verify="required" value="<%= @school.name %>" placeholder="请输入客户" autocomplete="off"
7
+ class="layui-input" id="inputFocus">
8
+ </div>
9
+ </div>
10
+ <br>
11
+ <div class="layui-inline">
12
+ <label class="layui-form-label">部门:</label>
13
+ <div class="layui-input-block" style="width: 500px;">
14
+ <input type="text" name="department" value="<%= @department&.name %>" placeholder="请输入部门" autocomplete="off" class="layui-input">
15
+ <%= hidden_field_tag "department_id", @@department.id %>
16
+ </div>
17
+ </div>
18
+ <br>
19
+ <div class="layui-inline">
20
+ <label class="layui-form-label">专业:</label>
21
+ <div class="layui-input-block" style="width: 500px;">
22
+ <input type="text" name="major" value="<%= @major&.name %>" placeholder="请输入专业" autocomplete="off" class="layui-input">
23
+ <%= hidden_field_tag "major_id", @major.id %>
24
+ </div>
25
+ </div>
26
+ <br>
27
+ <div class="layui-inline city_input">
28
+ <label class="layui-form-label ">省:</label>
29
+ <div class="layui-input-block" style="width: 500px;">
30
+ <select id="province" data-value="<%= @school.province.to_s %>" class="province layui-input"></select>
31
+ </div>
32
+ </div>
33
+ <br>
34
+ <div class="layui-inline city_input">
35
+ <label class="layui-form-label ">市:</label>
36
+ <div class="layui-input-block" style="width: 500px;">
37
+ <select id="city" data-value="<%= @school.city %>" class="city layui-input"></select>
38
+ </div>
39
+ </div>
40
+ <br>
41
+ <div class="layui-inline">
42
+ <label class="layui-form-label ">地址:</label>
43
+ <div class="layui-input-block" style="width: 500px;">
44
+ <input type="text" name="address" value="<%= @school.address %>" autocomplete="off"
45
+ class="layui-input" placeholder="请输入地址">
46
+ </div>
47
+ </div>
48
+ <div class="layui-form-item">
49
+ <label class="layui-form-label required">学校性质:</label>
50
+ <div class="layui-input-block">
51
+ <input type="checkbox" name="regular_college" lay-skin="primary" value="1" <%= 'checked' if @school_property&.regular_college %> title="本科院校">
52
+ <input type="checkbox" name="military_school" lay-skin="primary" value="1" <%= 'checked' if @school_property&.military_school %> title="军事院校">
53
+ <input type="checkbox" name="junior_college" lay-skin="primary" value="1" <%= 'checked' if @school_property&.junior_college %> title="高职院校">
54
+
55
+ </div>
56
+ </div>
57
+ <div class="layui-form-item">
58
+ <div class="layui-input-block">
59
+ <input type="checkbox" name="secondary_school" lay-skin="primary" value="1" <%= 'checked' if @school_property&.secondary_school %> title="中职院校">
60
+ <input type="checkbox" name="mid_school" lay-skin="primary" value="1" <%= 'checked' if @school_property&.mid_school %> title="中学">
61
+ <input type="checkbox" name="ele_school" lay-skin="primary" value="1" <%= 'checked' if @school_property&.ele_school %> title="小学">
62
+
63
+ </div>
64
+ </div>
65
+ <div class="layui-form-item">
66
+ <div class="layui-input-block">
67
+ <input type="checkbox" name="enterprise" lay-skin="primary" value="1" <%= 'checked' if @school_property&.enterprise %> title="企业">
68
+ <input type="checkbox" name="other" lay-skin="primary" value="1" <%= 'checked' if @school_property&.other %> title="其他">
69
+ </div>
70
+ </div>
71
+ <div class="layui-form-item" style="display: none;">
72
+ <div class="layui-input-block">
73
+ <input type="checkbox" style="display: none;" name="project_985" lay-skin="primary" value="1" <%= 'checked' if @school_property&.project_985 %> title="985工程">
74
+ <input type="checkbox" style="display: none;" name="project_211" lay-skin="primary" value="1" <%= 'checked' if @school_property&.project_211 %> title="211工程">
75
+ </div>
76
+ </div>
77
+ <div class="layui-inline" style="padding-left: 120px">
78
+ <button type="submit" class="layui-btn layui-btn-normal" lay-submit lay-filter="data-reset-btn">提交
79
+ </button>
80
+ </div>
81
+ </div>
82
+ </div>
83
+
84
+
85
+ <script>
86
+
87
+ layui.use(['form', 'table', 'upload', 'laytpl', 'request', 'selectInput', 'transfer'], function () {
88
+ var form = layui.form,
89
+ layer = layui.layer,
90
+ table = layui.table,
91
+ transfer = layui.transfer,
92
+ laytpl = layui.laytpl,
93
+ request = layui.request,
94
+ $ = layui.$;
95
+
96
+ form.render();
97
+
98
+ // 当前弹出层,防止ID被覆盖
99
+ var parentIndex = layer.index;
100
+
101
+
102
+ var dataCustom = [
103
+ { "n": '',
104
+ "s": []
105
+ },
106
+ {
107
+ "n": "北京",
108
+ "s": [
109
+ {"n": "东城"},
110
+ {"n": "西城"},
111
+ {"n": "朝阳"},
112
+ {"n": "丰台"},
113
+ {"n": "石景山"},
114
+ {"n": "海淀"},
115
+ {"n": "门头沟"},
116
+ {"n": "房山"},
117
+ {"n": "通州"},
118
+ {"n": "顺义"},
119
+ {"n": "昌平"},
120
+ {"n": "大兴"},
121
+ {"n": "平谷"},
122
+ {"n": "怀柔"},
123
+ {"n": "密云"},
124
+ {"n": "延庆"}
125
+ ]
126
+ },
127
+ {
128
+ "n": "上海",
129
+ "s": [
130
+ {"n": "崇明"}, {"n": "黄浦"}, {"n": "卢湾"}, {"n": "徐汇"}, {"n": "长宁"}, {"n": "静安"}, {"n": "普陀"}, {"n": "闸北"}, {"n": "虹口"}, {"n": "杨浦"}, {"n": "闵行"},
131
+ {"n": "宝山"}, {"n": "嘉定"}, {"n": "浦东"}, {"n": "金山"}, {"n": "松江"}, {"n": "青浦"}, {"n": "南汇"}, {"n": "奉贤"}
132
+ ]
133
+ },
134
+ {
135
+ "n": "广东",
136
+ "s": [
137
+ {"n": "广州"}, {"n": "深圳"}, {"n": "珠海"}, {"n": "东莞"}, {"n": "中山"}, {"n": "佛山"}, {"n": "惠州"}, {"n": "河源"}, {"n": "潮州"}, {"n": "江门"}, {"n": "揭阳"}, {"n": "茂名"},
138
+ {"n": "梅州"}, {"n": "清远"}, {"n": "汕头"}, {"n": "汕尾"}, {"n": "韶关"}, {"n": "顺德"}, {"n": "阳江"}, {"n": "云浮"}, {"n": "湛江"}, {"n": "肇庆"}
139
+ ]
140
+ },
141
+ {
142
+ "n": "江苏",
143
+ "s": [
144
+ {"n": "南京"}, {"n": "常熟"}, {"n": "常州"}, {"n": "海门"}, {"n": "淮安"}, {"n": "江都"}, {"n": "江阴"}, {"n": "昆山"}, {"n": "连云港"}, {"n": "南通"},
145
+ {"n": "启东"}, {"n": "沭阳"}, {"n": "宿迁"}, {"n": "苏州"}, {"n": "太仓"}, {"n": "泰州"}, {"n": "同里"}, {"n": "无锡"}, {"n": "徐州"}, {"n": "盐城"},
146
+ {"n": "扬州"}, {"n": "宜兴"}, {"n": "仪征"}, {"n": "张家港"}, {"n": "镇江"}, {"n": "周庄"}
147
+ ]
148
+ },
149
+ {
150
+ "n": "浙江",
151
+ "s": [
152
+ {"n": "杭州"}, {"n": "安吉"}, {"n": "慈溪"}, {"n": "定海"}, {"n": "奉化"}, {"n": "海盐"}, {"n": "黄岩"}, {"n": "湖州"}, {"n": "嘉兴"}, {"n": "金华"}, {"n": "临安"},
153
+ {"n": "临海"}, {"n": "丽水"}, {"n": "宁波"}, {"n": "瓯海"}, {"n": "平湖"}, {"n": "千岛湖"}, {"n": "衢州"}, {"n": "江山"}, {"n": "瑞安"}, {"n": "绍兴"}, {"n": "嵊州"},
154
+ {"n": "台州"}, {"n": "温岭"}, {"n": "温州"}, {"n": "余姚"}, {"n": "舟山"}
155
+ ]
156
+ },
157
+ {
158
+ "n": "重庆",
159
+ "s": [
160
+ {"n": "万州"}, {"n": "涪陵"}, {"n": "渝中"}, {"n": "大渡口"}, {"n": "江北"}, {"n": "沙坪坝"}, {"n": "九龙坡"}, {"n": "南岸"}, {"n": "北碚"}, {"n": "万盛"},
161
+ {"n": "双挢"}, {"n": "渝北"}, {"n": "巴南"}, {"n": "黔江"}, {"n": "长寿"}, {"n": "綦江"}, {"n": "潼南"}, {"n": "铜梁"}, {"n": "大足"}, {"n": "荣昌"}, {"n": "壁山"},
162
+ {"n": "梁平"}, {"n": "城口"}, {"n": "丰都"}, {"n": "垫江"}, {"n": "武隆"}, {"n": "忠县"}, {"n": "开县"}, {"n": "云阳"}, {"n": "奉节"}, {"n": "巫山"}, {"n": "巫溪"},
163
+ {"n": "石柱"}, {"n": "秀山"}, {"n": "酉阳"}, {"n": "彭水"}, {"n": "江津"}, {"n": "合川"}, {"n": "永川"}, {"n": "南川"}
164
+ ]
165
+ },
166
+ {
167
+ "n": "安徽",
168
+ "s": [
169
+ {"n": "合肥"}, {"n": "安庆"}, {"n": "蚌埠"}, {"n": "亳州"}, {"n": "巢湖"}, {"n": "滁州"}, {"n": "阜阳"}, {"n": "贵池"}, {"n": "淮北"}, {"n": "淮化"}, {"n": "淮南"},
170
+ {"n": "黄山"}, {"n": "九华山"}, {"n": "六安"}, {"n": "马鞍山"}, {"n": "宿州"}, {"n": "铜陵"}, {"n": "屯溪"}, {"n": "芜湖"}, {"n": "宣城"}
171
+ ]
172
+ },
173
+ {
174
+ "n": "福建",
175
+ "s": [
176
+ {"n": "福州"}, {"n": "厦门"}, {"n": "泉州"}, {"n": "漳州"}, {"n": "龙岩"}, {"n": "南平"}, {"n": "宁德"}, {"n": "莆田"}, {"n": "三明"}
177
+ ]
178
+ },
179
+ {
180
+ "n": "甘肃",
181
+ "s": [
182
+ {"n": "兰州"}, {"n": "白银"}, {"n": "定西"}, {"n": "敦煌"}, {"n": "甘南"}, {"n": "金昌"}, {"n": "酒泉"}, {"n": "临夏"}, {"n": "平凉"}, {"n": "天水"},
183
+ {"n": "武都"}, {"n": "武威"}, {"n": "西峰"}, {"n": "张掖"}
184
+ ]
185
+ },
186
+ {
187
+ "n": "广西",
188
+ "s": [
189
+ {"n": "南宁"}, {"n": "百色"}, {"n": "北海"}, {"n": "桂林"}, {"n": "防城港"}, {"n": "贵港"}, {"n": "河池"}, {"n": "贺州"}, {"n": "柳州"}, {"n": "钦州"}, {"n": "梧州"}, {"n": "玉林"}
190
+ ]
191
+ },
192
+ {
193
+ "n": "贵州",
194
+ "s": [
195
+ {"n": "贵阳"}, {"n": "安顺"}, {"n": "毕节"}, {"n": "都匀"}, {"n": "凯里"}, {"n": "六盘水"}, {"n": "铜仁"}, {"n": "兴义"}, {"n": "玉屏"}, {"n": "遵义"}
196
+ ]
197
+ },
198
+ {
199
+ "n": "海南",
200
+ "s": [
201
+ {"n": "海口"}, {"n": "儋县"}, {"n": "陵水"}, {"n": "琼海"}, {"n": "三亚"}, {"n": "通什"}, {"n": "万宁"}
202
+ ]
203
+ },
204
+ {
205
+ "n": "河北",
206
+ "s": [
207
+ {"n": "石家庄"}, {"n": "保定"}, {"n": "北戴河"}, {"n": "沧州"}, {"n": "承德"}, {"n": "丰润"}, {"n": "邯郸"}, {"n": "衡水"}, {"n": "廊坊"}, {"n": "南戴河"}, {"n": "秦皇岛"},
208
+ {"n": "唐山"}, {"n": "新城"}, {"n": "邢台"}, {"n": "张家口"}
209
+ ]
210
+ },
211
+ {
212
+ "n": "黑龙江",
213
+ "s": [
214
+ {"n": "哈尔滨"}, {"n": "北安"}, {"n": "大庆"}, {"n": "大兴安岭"}, {"n": "鹤岗"}, {"n": "黑河"}, {"n": "佳木斯"}, {"n": "鸡西"}, {"n": "牡丹江"}, {"n": "齐齐哈尔"},
215
+ {"n": "七台河"}, {"n": "双鸭山"}, {"n": "绥化"}, {"n": "伊春"}
216
+ ]
217
+ },
218
+ {
219
+ "n": "河南",
220
+ "s": [
221
+ {"n": "郑州"}, {"n": "安阳"}, {"n": "鹤壁"}, {"n": "潢川"}, {"n": "焦作"}, {"n": "济源"}, {"n": "开封"}, {"n": "漯河"}, {"n": "洛阳"}, {"n": "南阳"}, {"n": "平顶山"},
222
+ {"n": "濮阳"}, {"n": "三门峡"}, {"n": "商丘"}, {"n": "新乡"}, {"n": "信阳"}, {"n": "许昌"}, {"n": "周口"}, {"n": "驻马店"}
223
+ ]
224
+ },
225
+ {
226
+ "n": "湖北",
227
+ "s": [
228
+ {"n": "武汉"}, {"n": "恩施"}, {"n": "鄂州"}, {"n": "黄冈"}, {"n": "黄石"}, {"n": "荆门"}, {"n": "荆州"}, {"n": "潜江"}, {"n": "十堰"}, {"n": "随州"}, {"n": "武穴"},
229
+ {"n": "仙桃"}, {"n": "咸宁"}, {"n": "襄阳"}, {"n": "襄樊"}, {"n": "孝感"}, {"n": "宜昌"}
230
+ ]
231
+ },
232
+ {
233
+ "n": "湖南",
234
+ "s": [
235
+ {"n": "长沙"}, {"n": "常德"}, {"n": "郴州"}, {"n": "衡阳"}, {"n": "怀化"}, {"n": "吉首"}, {"n": "娄底"}, {"n": "邵阳"}, {"n": "湘潭"}, {"n": "益阳"}, {"n": "岳阳"},
236
+ {"n": "永州"}, {"n": "张家界"}, {"n": "株洲"}
237
+ ]
238
+ },
239
+ {
240
+ "n": "江西",
241
+ "s": [
242
+ {"n": "南昌"}, {"n": "抚州"}, {"n": "赣州"}, {"n": "吉安"}, {"n": "景德镇"}, {"n": "井冈山"}, {"n": "九江"}, {"n": "庐山"}, {"n": "萍乡"},
243
+ {"n": "上饶"}, {"n": "新余"}, {"n": "宜春"}, {"n": "鹰潭"}
244
+ ]
245
+ },
246
+ {
247
+ "n": "吉林",
248
+ "s": [
249
+ {"n": "长春"}, {"n": "吉林"}, {"n": "白城"}, {"n": "白山"}, {"n": "珲春"}, {"n": "辽源"}, {"n": "梅河"}, {"n": "四平"}, {"n": "松原"}, {"n": "通化"}, {"n": "延吉"}
250
+ ]
251
+ },
252
+ {
253
+ "n": "辽宁",
254
+ "s": [
255
+ {"n": "沈阳"}, {"n": "鞍山"}, {"n": "本溪"}, {"n": "朝阳"}, {"n": "大连"}, {"n": "丹东"}, {"n": "抚顺"}, {"n": "阜新"}, {"n": "葫芦岛"}, {"n": "锦州"},
256
+ {"n": "辽阳"}, {"n": "盘锦"}, {"n": "铁岭"}, {"n": "营口"}
257
+ ]
258
+ },
259
+ {
260
+ "n": "内蒙古",
261
+ "s": [
262
+ {"n": "呼和浩特"}, {"n": "阿拉善盟"}, {"n": "包头"}, {"n": "赤峰"}, {"n": "东胜"}, {"n": "海拉尔"}, {"n": "集宁"}, {"n": "临河"}, {"n": "通辽"}, {"n": "乌海"},
263
+ {"n": "乌兰浩特"}, {"n": "锡林浩特"}
264
+ ]
265
+ },
266
+ {
267
+ "n": "宁夏",
268
+ "s": [
269
+ {"n": "银川"}, {"n": "固源"}, {"n": "石嘴山"}, {"n": "吴忠"}
270
+ ]
271
+ },
272
+ {
273
+ "n": "青海",
274
+ "s": [
275
+ {"n": "西宁"}, {"n": "德令哈"}, {"n": "格尔木"}, {"n": "共和"}, {"n": "海东"}, {"n": "海晏"}, {"n": "玛沁"}, {"n": "同仁"}, {"n": "玉树"}
276
+ ]
277
+ },
278
+ {
279
+ "n": "山东",
280
+ "s": [
281
+ {"n": "济南"}, {"n": "滨州"}, {"n": "兖州"}, {"n": "德州"}, {"n": "东营"}, {"n": "菏泽"}, {"n": "济宁"}, {"n": "莱芜"}, {"n": "聊城"}, {"n": "临沂"},
282
+ {"n": "蓬莱"}, {"n": "青岛"}, {"n": "曲阜"}, {"n": "日照"}, {"n": "泰安"}, {"n": "潍坊"}, {"n": "威海"}, {"n": "烟台"}, {"n": "枣庄"}, {"n": "淄博"}
283
+ ]
284
+ },
285
+ {
286
+ "n": "山西",
287
+ "s": [
288
+ {"n": "太原"}, {"n": "长治"}, {"n": "大同"}, {"n": "候马"}, {"n": "晋城"}, {"n": "离石"}, {"n": "临汾"}, {"n": "宁武"}, {"n": "朔州"}, {"n": "忻州"},
289
+ {"n": "阳泉"}, {"n": "榆次"}, {"n": "运城"}
290
+ ]
291
+ },
292
+ {
293
+ "n": "陕西",
294
+ "s": [
295
+ {"n": "西安"}, {"n": "安康"}, {"n": "宝鸡"}, {"n": "汉中"}, {"n": "渭南"}, {"n": "商州"}, {"n": "绥德"}, {"n": "铜川"}, {"n": "咸阳"}, {"n": "延安"}, {"n": "榆林"}
296
+ ]
297
+ },
298
+ {
299
+ "n": "四川",
300
+ "s": [
301
+ {"n": "成都"}, {"n": "巴中"}, {"n": "达川"}, {"n": "德阳"}, {"n": "都江堰"}, {"n": "峨眉山"}, {"n": "涪陵"}, {"n": "广安"}, {"n": "广元"}, {"n": "九寨沟"},
302
+ {"n": "康定"}, {"n": "乐山"}, {"n": "泸州"}, {"n": "马尔康"}, {"n": "绵阳"}, {"n": "眉山"}, {"n": "南充"}, {"n": "内江"}, {"n": "攀枝花"}, {"n": "遂宁"},
303
+ {"n": "汶川"}, {"n": "西昌"}, {"n": "雅安"}, {"n": "宜宾"}, {"n": "自贡"}, {"n": "资阳"}
304
+ ]
305
+ },
306
+ {
307
+ "n": "天津",
308
+ "s": [
309
+ {"n": "天津"}, {"n": "和平"}, {"n": "东丽"}, {"n": "河东"}, {"n": "西青"}, {"n": "河西"}, {"n": "津南"}, {"n": "南开"}, {"n": "北辰"}, {"n": "河北"}, {"n": "武清"}, {"n": "红挢"},
310
+ {"n": "塘沽"}, {"n": "汉沽"}, {"n": "大港"}, {"n": "宁河"}, {"n": "静海"}, {"n": "宝坻"}, {"n": "蓟县"}
311
+ ]
312
+ },
313
+ {
314
+ "n": "新疆",
315
+ "s": [
316
+ {"n": "乌鲁木齐"}, {"n": "阿克苏"}, {"n": "阿勒泰"}, {"n": "阿图什"}, {"n": "博乐"}, {"n": "昌吉"}, {"n": "东山"}, {"n": "哈密"}, {"n": "和田"}, {"n": "喀什"},
317
+ {"n": "克拉玛依"}, {"n": "库车"}, {"n": "库尔勒"}, {"n": "奎屯"}, {"n": "石河子"}, {"n": "塔城"}, {"n": "吐鲁番"}, {"n": "伊宁"}
318
+ ]
319
+ },
320
+ {
321
+ "n": "西藏",
322
+ "s": [
323
+ {"n": "拉萨"}, {"n": "阿里"}, {"n": "昌都"}, {"n": "林芝"}, {"n": "那曲"}, {"n": "日喀则"}, {"n": "山南"}
324
+ ]
325
+ },
326
+ {
327
+ "n": "云南",
328
+ "s": [
329
+ {"n": "昆明"}, {"n": "大理"}, {"n": "保山"}, {"n": "楚雄"}, {"n": "大理"}, {"n": "东川"}, {"n": "个旧"}, {"n": "景洪"}, {"n": "开远"}, {"n": "临沧"}, {"n": "丽江"},
330
+ {"n": "六库"}, {"n": "潞西"}, {"n": "曲靖"}, {"n": "思茅"}, {"n": "文山"}, {"n": "西双版纳"}, {"n": "玉溪"}, {"n": "中甸"}, {"n": "昭通"}
331
+ ]
332
+ },
333
+ {
334
+ "n": "香港特别行政区",
335
+ "s": [
336
+ {"n": "香港"}, {"n": "九龙"}, {"n": "新界"}
337
+ ]
338
+ },
339
+ {
340
+ "n": "澳门特别行政区",
341
+ "s": [
342
+ {"n": {"n": "澳门"}}
343
+ ]
344
+ },
345
+ {
346
+ "n": "台湾",
347
+ "s": [
348
+ {"n": "台北"}, {"n": "基隆"}, {"n": "台南"}, {"n": "台中"}, {"n": "高雄"}, {"n": "屏东"}, {"n": "南投"}, {"n": "云林"}, {"n": "新竹"}, {"n": "彰化"}, {"n": "苗栗"},
349
+ {"n": "嘉义"}, {"n": "花莲"}, {"n": "桃园"}, {"n": "宜兰"}, {"n": "台东"}, {"n": "金门"}, {"n": "马祖"}, {"n": "澎湖"}
350
+ ]
351
+ },
352
+ {
353
+ "n": "海外",
354
+ "s": [
355
+ {"n": "美国"}, {"n": "日本"}, {"n": "英国"}, {"n": "法国"}, {"n": "德国"}, {"n": "其他"}
356
+ ]
357
+ }
358
+ ]
359
+
360
+ // 自定义选项
361
+ $('#custom_data').cxSelect({
362
+ selects: ['province', 'city'],
363
+ data: dataCustom
364
+ });
365
+
366
+ //监听提交
367
+ form.on('submit(data-reset-btn)', function (data) {
368
+ data.field.province = $("#province option:selected").text(); //获取选中的项
369
+ data.field.city = $("#city option:selected").text(); //获取选中的项
370
+ if (data.field.enterprise == undefined && data.field.junior_college == undefined &&
371
+ data.field.military_school == undefined && data.field.project_211 == undefined && data.field.project_985 == undefined
372
+ && data.field.regular_college == undefined && data.field.secondary_school == undefined
373
+ && data.field.other == undefined && data.field.mid_school == undefined
374
+ && data.field.ele_school == undefined) {
375
+ layer.alert("请选择学校性质");
376
+ return false;
377
+ }
378
+
379
+ request.authPut("missions/customers/" + <%= @school.id %>, data.field, function (res) {
380
+ if (res.success === false) {
381
+ layer.alert(res.msg)
382
+ } else {
383
+ layer.closeAll(); //关闭所有层
384
+ table.reload('customers_table')
385
+ }
386
+ })
387
+ return false;
388
+ });
389
+ });
390
+ </script>
391
+ <script type="text/javascript" charset="utf-8">
392
+ /*!
393
+ * jQuery cxSelect
394
+ * @name jquery.cxselect.js
395
+ * @version 1.4.1
396
+ * @date 2016-11-02
397
+ * @author ciaoca
398
+ * @email ciaoca@gmail.com
399
+ * @site https://github.com/ciaoca/cxSelect
400
+ * @license Released under the MIT license
401
+ */
402
+ (function (factory) {
403
+ if (typeof define === 'function' && define.amd) {
404
+ define(['jquery'], factory);
405
+ } else {
406
+ factory(window.jQuery || window.Zepto || window.$);
407
+ }
408
+ ;
409
+ }(function ($) {
410
+ var cxSelect = function () {
411
+ var self = this;
412
+ var dom, settings, callback;
413
+
414
+ // 分配参数
415
+ for (var i = 0, l = arguments.length; i < l; i++) {
416
+ if (cxSelect.isJquery(arguments[i]) || cxSelect.isZepto(arguments[i])) {
417
+ dom = arguments[i];
418
+ } else if (cxSelect.isElement(arguments[i])) {
419
+ dom = $(arguments[i]);
420
+ } else if (typeof arguments[i] === 'function') {
421
+ callback = arguments[i];
422
+ } else if (typeof arguments[i] === 'object') {
423
+ settings = arguments[i];
424
+ }
425
+ ;
426
+ }
427
+ ;
428
+
429
+ var api = new cxSelect.init(dom, settings);
430
+
431
+ if (typeof callback === 'function') {
432
+ callback(api);
433
+ }
434
+ ;
435
+
436
+ return api;
437
+ };
438
+
439
+ cxSelect.isElement = function (o) {
440
+ if (o && (typeof HTMLElement === 'function' || typeof HTMLElement === 'object') && o instanceof HTMLElement) {
441
+ return true;
442
+ } else {
443
+ return (o && o.nodeType && o.nodeType === 1) ? true : false;
444
+ }
445
+ ;
446
+ };
447
+
448
+ cxSelect.isJquery = function (o) {
449
+ return (o && o.length && (typeof jQuery === 'function' || typeof jQuery === 'object') && o instanceof jQuery) ? true : false;
450
+ };
451
+
452
+ cxSelect.isZepto = function (o) {
453
+ return (o && o.length && (typeof Zepto === 'function' || typeof Zepto === 'object') && Zepto.zepto.isZ(o)) ? true : false;
454
+ };
455
+
456
+ cxSelect.getIndex = function (n, required) {
457
+ return required ? n : n - 1;
458
+ };
459
+
460
+ cxSelect.getData = function (data, space) {
461
+ if (typeof space === 'string' && space.length) {
462
+ space = space.split('.');
463
+ for (var i = 0, l = space.length; i < l; i++) {
464
+ data = data[space[i]];
465
+ }
466
+ ;
467
+ }
468
+ ;
469
+ return data;
470
+ };
471
+
472
+ cxSelect.init = function (dom, settings) {
473
+ var self = this;
474
+
475
+ if (!cxSelect.isJquery(dom) && !cxSelect.isZepto(dom)) {
476
+ return
477
+ }
478
+ ;
479
+
480
+ var theSelect = {
481
+ dom: {
482
+ box: dom
483
+ }
484
+ };
485
+
486
+ self.attach = cxSelect.attach.bind(theSelect);
487
+ self.detach = cxSelect.detach.bind(theSelect);
488
+ self.setOptions = cxSelect.setOptions.bind(theSelect);
489
+ self.clear = cxSelect.clear.bind(theSelect);
490
+
491
+ theSelect.changeEvent = function () {
492
+ cxSelect.selectChange.call(theSelect, this.className);
493
+ };
494
+
495
+ theSelect.settings = $.extend({}, $.cxSelect.defaults, settings, {
496
+ url: theSelect.dom.box.data('url'),
497
+ emptyStyle: theSelect.dom.box.data('emptyStyle'),
498
+ required: theSelect.dom.box.data('required'),
499
+ firstTitle: theSelect.dom.box.data('firstTitle'),
500
+ firstValue: theSelect.dom.box.data('firstValue'),
501
+ jsonSpace: theSelect.dom.box.data('jsonSpace'),
502
+ jsonName: theSelect.dom.box.data('jsonName'),
503
+ jsonValue: theSelect.dom.box.data('jsonValue'),
504
+ jsonSub: theSelect.dom.box.data('jsonSub')
505
+ });
506
+
507
+ var _dataSelects = theSelect.dom.box.data('selects');
508
+
509
+ if (typeof _dataSelects === 'string' && _dataSelects.length) {
510
+ theSelect.settings.selects = _dataSelects.split(',');
511
+ }
512
+ ;
513
+
514
+ self.setOptions();
515
+ self.attach();
516
+
517
+ // 使用独立接口获取数据
518
+ if (!theSelect.settings.url && !theSelect.settings.data) {
519
+ cxSelect.start.apply(theSelect);
520
+
521
+ // 设置自定义数据
522
+ } else if ($.isArray(theSelect.settings.data)) {
523
+ cxSelect.start.call(theSelect, theSelect.settings.data);
524
+
525
+ // 设置 URL,通过 Ajax 获取数据
526
+ } else if (typeof theSelect.settings.url === 'string' && theSelect.settings.url.length) {
527
+ $.getJSON(theSelect.settings.url, function (json) {
528
+ cxSelect.start.call(theSelect, json);
529
+ });
530
+ }
531
+ ;
532
+ };
533
+
534
+ // 设置参数
535
+ cxSelect.setOptions = function (opts) {
536
+ var self = this;
537
+
538
+ if (opts) {
539
+ $.extend(self.settings, opts);
540
+ }
541
+ ;
542
+
543
+ // 初次或重设选择器组
544
+ if (!$.isArray(self.selectArray) || !self.selectArray.length || (opts && opts.selects)) {
545
+ self.selectArray = [];
546
+
547
+ if ($.isArray(self.settings.selects) && self.settings.selects.length) {
548
+ var _tempSelect;
549
+
550
+ for (var i = 0, l = self.settings.selects.length; i < l; i++) {
551
+ _tempSelect = self.dom.box.find('select.' + self.settings.selects[i]);
552
+
553
+ if (!_tempSelect || !_tempSelect.length) {
554
+ break
555
+ }
556
+ ;
557
+
558
+ self.selectArray.push(_tempSelect);
559
+ }
560
+ ;
561
+ }
562
+ ;
563
+ }
564
+ ;
565
+
566
+ if (opts) {
567
+ if (!$.isArray(opts.data) && typeof opts.url === 'string' && opts.url.length) {
568
+ $.getJSON(self.settings.url, function (json) {
569
+ cxSelect.start.call(self, json);
570
+ });
571
+
572
+ } else {
573
+ cxSelect.start.call(self, opts.data);
574
+ }
575
+ ;
576
+ }
577
+ ;
578
+ };
579
+
580
+ // 绑定
581
+ cxSelect.attach = function () {
582
+ var self = this;
583
+
584
+ if (!self.attachStatus) {
585
+ self.dom.box.on('change', 'select', self.changeEvent);
586
+ }
587
+ ;
588
+
589
+ if (typeof self.attachStatus === 'boolean') {
590
+ cxSelect.start.call(self);
591
+ }
592
+ ;
593
+
594
+ self.attachStatus = true;
595
+ };
596
+
597
+ // 移除绑定
598
+ cxSelect.detach = function () {
599
+ var self = this;
600
+ self.dom.box.off('change', 'select', self.changeEvent);
601
+ self.attachStatus = false;
602
+ };
603
+
604
+ // 清空选项
605
+ cxSelect.clear = function (index) {
606
+ var self = this;
607
+ var _style = {
608
+ display: '',
609
+ visibility: ''
610
+ };
611
+
612
+ index = isNaN(index) ? 0 : index;
613
+
614
+ // 清空后面的 select
615
+ for (var i = index, l = self.selectArray.length; i < l; i++) {
616
+ self.selectArray[i].empty().prop('disabled', true);
617
+
618
+ if (self.settings.emptyStyle === 'none') {
619
+ _style.display = 'none';
620
+ } else if (self.settings.emptyStyle === 'hidden') {
621
+ _style.visibility = 'hidden';
622
+ }
623
+ ;
624
+
625
+ self.selectArray[i].css(_style);
626
+ }
627
+ ;
628
+ };
629
+
630
+ cxSelect.start = function (data) {
631
+ var self = this;
632
+
633
+ if ($.isArray(data)) {
634
+ self.settings.data = cxSelect.getData(data, self.settings.jsonSpace);
635
+ }
636
+ ;
637
+
638
+ if (!self.selectArray.length) {
639
+ return
640
+ }
641
+ ;
642
+
643
+ // 保存默认值
644
+ for (var i = 0, l = self.selectArray.length; i < l; i++) {
645
+ if (typeof self.selectArray[i].attr('data-value') !== 'string' && self.selectArray[i][0].options.length) {
646
+ self.selectArray[i].attr('data-value', self.selectArray[i].val());
647
+ }
648
+ ;
649
+ }
650
+ ;
651
+
652
+ if (self.settings.data || (typeof self.selectArray[0].data('url') === 'string' && self.selectArray[0].data('url').length)) {
653
+ cxSelect.getOptionData.call(self, 0);
654
+ } else {
655
+ self.selectArray[0].prop('disabled', false).css({
656
+ 'display': '',
657
+ 'visibility': ''
658
+ });
659
+ }
660
+ ;
661
+ };
662
+
663
+ // 获取选项数据
664
+ cxSelect.getOptionData = function (index) {
665
+ var self = this;
666
+
667
+ if (typeof index !== 'number' || isNaN(index) || index < 0 || index >= self.selectArray.length) {
668
+ return
669
+ }
670
+ ;
671
+
672
+ var _indexPrev = index - 1;
673
+ var _select = self.selectArray[index];
674
+ var _selectData;
675
+ var _valueIndex;
676
+ var _dataUrl = _select.data('url');
677
+ var _jsonSpace = typeof _select.data('jsonSpace') === 'undefined' ? self.settings.jsonSpace : _select.data('jsonSpace');
678
+ var _query = {};
679
+ var _queryName;
680
+ var _selectName;
681
+ var _selectValue;
682
+
683
+ cxSelect.clear.call(self, index);
684
+
685
+ // 使用独立接口
686
+ if (typeof _dataUrl === 'string' && _dataUrl.length) {
687
+ if (index > 0) {
688
+ for (var i = 0, j = 1; i < index; i++, j++) {
689
+ _queryName = self.selectArray[j].data('queryName');
690
+ _selectName = self.selectArray[i].attr('name');
691
+ _selectValue = self.selectArray[i].val();
692
+
693
+ if (typeof _queryName === 'string' && _queryName.length) {
694
+ _query[_queryName] = _selectValue;
695
+ } else if (typeof _selectName === 'string' && _selectName.length) {
696
+ _query[_selectName] = _selectValue;
697
+ }
698
+ ;
699
+ }
700
+ ;
701
+ }
702
+ ;
703
+
704
+ $.getJSON(_dataUrl, _query, function (json) {
705
+ _selectData = cxSelect.getData(json, _jsonSpace);
706
+
707
+ cxSelect.buildOption.call(self, index, _selectData);
708
+ });
709
+
710
+ // 使用整合数据
711
+ } else if (self.settings.data && typeof self.settings.data === 'object') {
712
+ _selectData = self.settings.data;
713
+
714
+ for (var i = 0; i < index; i++) {
715
+ _valueIndex = cxSelect.getIndex(self.selectArray[i][0].selectedIndex, typeof self.selectArray[i].data('required') === 'boolean' ? self.selectArray[i].data('required') : self.settings.required);
716
+
717
+ if (typeof _selectData[_valueIndex] === 'object' && $.isArray(_selectData[_valueIndex][self.settings.jsonSub]) && _selectData[_valueIndex][self.settings.jsonSub].length) {
718
+ _selectData = _selectData[_valueIndex][self.settings.jsonSub];
719
+ } else {
720
+ _selectData = null;
721
+ break;
722
+ }
723
+ ;
724
+ }
725
+ ;
726
+
727
+ cxSelect.buildOption.call(self, index, _selectData);
728
+ }
729
+ ;
730
+ };
731
+
732
+ // 构建选项列表
733
+ cxSelect.buildOption = function (index, data) {
734
+ var self = this;
735
+
736
+ var _select = self.selectArray[index];
737
+ var _required = typeof _select.data('required') === 'boolean' ? _select.data('required') : self.settings.required;
738
+ var _firstTitle = typeof _select.data('firstTitle') === 'undefined' ? self.settings.firstTitle : _select.data('firstTitle');
739
+ var _firstValue = typeof _select.data('firstValue') === 'undefined' ? self.settings.firstValue : _select.data('firstValue');
740
+ var _jsonName = typeof _select.data('jsonName') === 'undefined' ? self.settings.jsonName : _select.data('jsonName');
741
+ var _jsonValue = typeof _select.data('jsonValue') === 'undefined' ? self.settings.jsonValue : _select.data('jsonValue');
742
+
743
+ if (!$.isArray(data)) {
744
+ return
745
+ }
746
+ ;
747
+
748
+ var _html = !_required ? '<option value="' + String(_firstValue) + '">' + String(_firstTitle) + '</option>' : '';
749
+
750
+ // 区分标题、值的数据
751
+ if (typeof _jsonName === 'string' && _jsonName.length) {
752
+ // 无值字段时使用标题作为值
753
+ if (typeof _jsonValue !== 'string' || !_jsonValue.length) {
754
+ _jsonValue = _jsonName;
755
+ }
756
+ ;
757
+
758
+ for (var i = 0, l = data.length; i < l; i++) {
759
+ _html += '<option value="' + String(data[i][_jsonValue]) + '">' + String(data[i][_jsonName]) + '</option>';
760
+ }
761
+ ;
762
+
763
+ // 数组即为值的数据
764
+ } else {
765
+ for (var i = 0, l = data.length; i < l; i++) {
766
+ _html += '<option value="' + String(data[i]) + '">' + String(data[i]) + '</option>';
767
+ }
768
+ ;
769
+ }
770
+ ;
771
+
772
+ _select.html(_html).prop('disabled', false).css({
773
+ 'display': '',
774
+ 'visibility': ''
775
+ });
776
+
777
+ // 初次加载设置默认值
778
+ if (typeof _select.attr('data-value') === 'string') {
779
+ _select.val(String(_select.attr('data-value'))).removeAttr('data-value');
780
+
781
+ if (_select[0].selectedIndex < 0) {
782
+ _select[0].options[0].selected = true;
783
+ }
784
+ ;
785
+ }
786
+ ;
787
+
788
+ if (_required || _select[0].selectedIndex > 0) {
789
+ _select.trigger('change');
790
+ }
791
+ ;
792
+
793
+ };
794
+
795
+ // 改变选择时的处理
796
+ cxSelect.selectChange = function (name) {
797
+ var self = this;
798
+
799
+ if (typeof name !== 'string' || !name.length) {
800
+ return
801
+ }
802
+ ;
803
+
804
+ var index;
805
+
806
+ name = name.replace(/\s+/g, ',');
807
+ name = ',' + name + ',';
808
+
809
+ // 获取当前 select 位置
810
+ for (var i = 0, l = self.selectArray.length; i < l; i++) {
811
+ if (name.indexOf(',' + self.settings.selects[i] + ',') > -1) {
812
+ index = i;
813
+ break;
814
+ }
815
+ ;
816
+ }
817
+ ;
818
+
819
+ if (typeof index === 'number' && index > -1) {
820
+ index += 1;
821
+ cxSelect.getOptionData.call(self, index);
822
+ }
823
+ ;
824
+ };
825
+
826
+ $.cxSelect = function () {
827
+ return cxSelect.apply(this, arguments);
828
+ };
829
+
830
+ // 默认值
831
+ $.cxSelect.defaults = {
832
+ selects: [], // 下拉选框组
833
+ url: null, // 列表数据文件路径(URL)或数组数据
834
+ data: null, // 自定义数据
835
+ emptyStyle: null, // 无数据状态显示方式
836
+ required: false, // 是否为必选
837
+ firstTitle: '请选择', // 第一个选项的标题
838
+ firstValue: '', // 第一个选项的值
839
+ jsonSpace: '', // 数据命名空间
840
+ jsonName: 'n', // 数据标题字段名称
841
+ jsonValue: '', // 数据值字段名称
842
+ jsonSub: 's' // 子集数据字段名称
843
+ };
844
+
845
+ $.fn.cxSelect = function (settings, callback) {
846
+ this.each(function (i) {
847
+ $.cxSelect(this, settings, callback);
848
+ });
849
+ return this;
850
+ };
851
+ }));
852
+
853
+ </script>
854
+ <style>
855
+ .layui-form .city_input .layui-input {
856
+ display: none;
857
+ !important;
858
+ }
859
+
860
+ .layui-form .city_input .province {
861
+ display: block;
862
+ }
863
+
864
+ .layui-form .city_input .city {
865
+ display: block;
866
+ }
867
+
868
+ .layui-edge {
869
+ display: none;
870
+ !important;
871
+ }
872
+ </style>