main.js 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. /** EasyWeb spa v3.1.7 date:2020-03-11 License By http://easyweb.vip */
  2. layui.config({
  3. version: true, // 更新组件缓存,设为true不缓存,也可以设一个固定值
  4. base: 'assets/module/'
  5. }).extend({
  6. dropdown: 'dropdown/dropdown',
  7. notice: 'notice/notice',
  8. cascader: 'cascader/cascader',
  9. fileChoose: 'fileChoose/fileChoose',
  10. step: 'step-lay/step',
  11. treeTable: 'treeTable/treeTable',
  12. tagsInput: 'tagsInput/tagsInput',
  13. Split: 'Split/Split',
  14. Cropper: 'Cropper/Cropper',
  15. Equencing: 'Equencing/Equencing',
  16. CKEDITOR: 'ckeditor/ckeditor',
  17. citypicker: 'city-picker/city-picker',
  18. zTree: 'zTree/zTree',
  19. sku: 'sku/sku',
  20. authTree: 'authTree/authtree',
  21. xmSelect: 'xmSelect',
  22. introJs: 'introJs/introJs',
  23. TMap: 'TMap/TMap'
  24. }).use(['layer', 'setter', 'layRouter','contextMenu','element', 'index', 'form','table', 'admin', 'notice', 'fileChoose'], function () {
  25. var $ = layui.jquery;
  26. var layer = layui.layer;
  27. var layRouter = layui.layRouter;
  28. var contextMenu = layui.contextMenu;
  29. var element = layui.element;
  30. var setter = layui.setter;
  31. var index = layui.index;
  32. var form = layui.form;
  33. var table = layui.table;
  34. var admin = layui.admin;
  35. var notice = layui.notice;
  36. var fileChoose = layui.fileChoose;
  37. // 默认错误路由注册
  38. layRouter.reg('#/error/error-403');
  39. layRouter.reg('#/error/error-404');
  40. layRouter.reg('#/error/error-500');
  41. // 检查是否登录
  42. if (!setter.getToken()) {
  43. return window.location.href = '/agent/pages/login.html';
  44. }
  45. var func = {
  46. /**
  47. * 解析json字符串
  48. * @param str 字符串
  49. * @returns JSON
  50. */
  51. jsonParse: function (str) {
  52. var json = str;
  53. for (var i in "string" == typeof str && (json = new Function("return " + str)() || {}), json) null != json[i] && "" != json[i] && (0 == json[i].toString().indexOf("function") ? json[i] = new Function("return " + json[i])() : "object" == typeof json[i] && (json[i] = this.jsonParse(json[i])));
  54. return json
  55. },
  56. /**
  57. * 普通事件请求
  58. * @param o this元素
  59. * @returns {boolean}
  60. */
  61. request: function (o) {
  62. var t = $(o),
  63. d = func.jsonParse(t.attr('event-data')),
  64. f = function () {
  65. admin.req(d.url, (r) => {
  66. if (r.code === 10000){
  67. notice.msg(r.message, {icon: 1}, function () {
  68. (t.attr('refresh')) ?
  69. // 刷新页面
  70. admin.refresh() :
  71. // 刷新表
  72. table.reload('dataTable', {});
  73. })
  74. }else {
  75. notice.msg(r.message, {icon: 2});
  76. }
  77. }, d.action || 'get');
  78. };
  79. if (!d) {
  80. notice.msg('请设置event-data参数!', {icon: 3});
  81. return false;
  82. }
  83. // 确认操作
  84. if (typeof (t.attr('confirm')) == 'undefined') {
  85. f();
  86. } else {
  87. layer.confirm(t.attr('confirm') || '你确定要执行操作吗?', {title: false, closeBtn: 0}, function (index) {
  88. f();
  89. // 关闭消息弹出
  90. layer.close(index);
  91. });
  92. }
  93. }
  94. };
  95. /**
  96. * 注册应用事件
  97. *
  98. */
  99. func.events = {
  100. /**
  101. * 点击请求
  102. * @param o
  103. * @returns {boolean}
  104. */
  105. request: function (o) {
  106. func.request(o);
  107. },
  108. /* 打开修改密码弹窗 */
  109. psw: function () {
  110. var url = $(this).data('url');
  111. admin.open({
  112. id: 'layer-psw',
  113. title: '修改密码',
  114. shade: 0,
  115. url: url ? url : 'pages/tpl/password.html'
  116. });
  117. },
  118. /* 退出登录 */
  119. logout: function () {
  120. admin.unlockScreen();
  121. var url = $(this).data('url');
  122. var confirm = $(this).data('confirm');
  123. if (false === confirm || 'false' === confirm) {
  124. setter.clearCache(); //20200322 清除本地缓存
  125. url ? location.replace(url) : location.reload();
  126. return;
  127. }
  128. layer.confirm('确定要退出登录吗?', {
  129. title: '温馨提示',
  130. skin: 'layui-layer-admin'
  131. }, function (){
  132. setter.clearCache(); //20200322 清除本地缓存
  133. url ? location.replace(url) : location.reload();
  134. });
  135. },
  136. };
  137. /**
  138. * 应用事件监听
  139. */
  140. $(document).on("click", "*[app-event]", function () {
  141. var n = $(this).attr("app-event");
  142. var o = func.events[n];
  143. o && o.call(this, $(this))
  144. });
  145. table.set({
  146. response: {
  147. statusName: 'code' //规定数据状态的字段名称,默认:code
  148. , statusCode: 10000 //规定成功的状态码,默认:0
  149. , countName: 'total' //规定数据总数的字段名称,默认:count
  150. },
  151. parseData: (res) => { //res 即为原始返回的数据
  152. let ret = {code: 10000, msg: 'OK!', total: 0, data: []};
  153. if (typeof (res.errcode) != 'undefined') {
  154. if (res.errcode === 30001) {
  155. setter.removeToken();
  156. notice.msg('用户失效,请重新登录!', {icon: 2}, function () {
  157. location.reload();
  158. });
  159. }
  160. ret.msg = res.errmsg
  161. } else {
  162. ret.code = res.code;
  163. ret.msg = res.message;
  164. ret.total = res.data.total;
  165. ret.data = res.data.list
  166. }
  167. return ret;
  168. }
  169. });
  170. // 初始化请求token
  171. // 2020/04/01 刷新token
  172. $.ajaxSetup({
  173. headers: {
  174. Authorization: setter.getToken() // 默认值
  175. },
  176. complete: function(xhr, status) {
  177. var token = xhr.getResponseHeader('Authorization');
  178. if (token !== null) {
  179. setter.putToken(token);
  180. $.ajaxSetup({
  181. headers: {
  182. Authorization: token // 更新
  183. }
  184. });
  185. for (var t = Date.now(); Date.now() - t <= 200;) ;
  186. }
  187. }
  188. });
  189. // 配置
  190. admin.req('config', (res) => {
  191. if (10000 === res.code) {
  192. setter.setCache('config', res.data);
  193. } else {
  194. notice.msg(res.message, {icon: 2});
  195. }
  196. }, 'GET');
  197. // 获取用户信息/包括自己的权限
  198. admin.req('person', (res) => {
  199. if (10000 === res.code) {
  200. setter.putUser(res.data);
  201. admin.renderPerm(); // 移除没有权限的元素
  202. $('#huName').text(res.data.username);
  203. //
  204. var headerHtml = '',
  205. headerSubHtml = '<li class="layui-nav-item layui-hide-sm layui-show-xs-inline-block" lay-unselect>\n' +
  206. ' <a>更多</a>\n' +
  207. ' <dl class="layui-nav-child">',
  208. // 树形菜单处理
  209. permissions = setter.lists2tree(res.data.permissions,'subMenus');
  210. // 渲染侧边栏
  211. for (var i = 0; i < permissions.length; i++) {
  212. index.renderSide(permissions[i].subMenus, sideNav.innerHTML, function (html) {
  213. html = '<ul nav-id="' + permissions[i].url + '" class="layui-nav layui-nav-tree" lay-shrink="all" lay-filter="admin-side-nav">' + html;
  214. html += '</ul>';
  215. $('.layui-layout-admin .layui-side .layui-side-scroll').append(html);
  216. });
  217. headerHtml += '<li class="layui-nav-item layui-hide-xs" lay-unselect><a nav-bind="' + permissions[i].url + '"><i style="margin-right: 6px;" class="layui-icon ' + permissions[i].icon + '"></i>' + permissions[i].name + '</a></li>';
  218. headerSubHtml += '<dd lay-unselect><a nav-bind="' + permissions[i].url + '">' + permissions[i].name + '</a></dd>'
  219. }
  220. headerSubHtml += '</dl></li>'
  221. // 渲染头部
  222. var $header = $('.layui-layout-admin .layui-header .layui-layout-left');
  223. $header.find('.layui-nav-bar').remove();
  224. $header.append(headerHtml);
  225. $header.append(headerSubHtml);
  226. element.render('nav');
  227. index.regRouter(permissions); // 注册路由
  228. // 加载主页
  229. index.loadHome({
  230. url: '/agent/#/workplace',
  231. name: '<i class="layui-icon layui-icon-home"></i>'
  232. });
  233. // 移除loading
  234. admin.removeLoading();
  235. } else {
  236. notice.msg(res.message, {icon: 2});
  237. }
  238. }, 'GET');
  239. /**
  240. * 划过图片事件监听
  241. */
  242. $(document).on("mouseover", ".input-img-preview", (function (e) {
  243. var t = $(this), opt = t.attr("options") ? func.jsonParse(t.attr("options")) : {width: "600px", height: "100%"},
  244. d = "<div id='input-img-preview' class='input-img-preview' style='z-index: 999999999;background: #3c9'><img src='" + this.src + "' width='" + (opt.width || "") + "' height='" + (opt.height || "") + "' /></div>";
  245. $("body").append(d);
  246. })).on("mouseout", ".input-img-preview", (function () {
  247. $("#input-img-preview").remove();
  248. })).on("mousemove", ".input-img-preview", (function (e) {
  249. $("#input-img-preview").css({position: "absolute", left: e.pageX + 10, top: e.pageY + 10});
  250. }));
  251. //todo 等待优化文件选择单选
  252. $(document).on('click', '#btnDialogFileChoose', function () {
  253. var showImg = $('#upShowImg');
  254. var imgInput = $('#upInput');
  255. fileChoose.open({
  256. headers: {
  257. 'Authorization': setter.getToken()
  258. },
  259. listUrl: setter.baseServer + 'system/annex',
  260. uploadUrl: setter.baseServer + 'system/annex/upload',
  261. operaUrl: setter.baseServer + 'system/annex/operation',
  262. num: 1,
  263. dialog: {
  264. offset: '60px'
  265. },
  266. response: {
  267. code: 10000,
  268. smUrl: 'thumbs'
  269. },
  270. onChoose: function (choose) {
  271. var chooseUrl = choose[0].url;
  272. // 赋值图片显示
  273. showImg[0].src = chooseUrl;
  274. imgInput[0].value = chooseUrl;
  275. }
  276. });
  277. });
  278. //todo 等待优化文件选择
  279. $(document).on('click', '.dialog-file-choose', function () {
  280. var t = $(this),
  281. s =t.attr('data-input'),
  282. c =t.attr('data-count') || 0,
  283. e =t.attr('data-type') || 'img',
  284. i = $('input[name='+ s +']'),
  285. j = $('.'+ s);
  286. fileChoose.open({
  287. headers: {
  288. 'Authorization': setter.getToken()
  289. },
  290. listUrl: setter.baseServer + 'system/annex',
  291. uploadUrl: setter.baseServer + 'system/annex/upload',
  292. operaUrl: setter.baseServer + 'system/annex/operation',
  293. num: (c > 1) ? c : 1,
  294. dialog: {
  295. offset: '60px'
  296. },
  297. response: {
  298. code: 10000,
  299. smUrl: 'thumbs'
  300. },
  301. onChoose: function (choose) {
  302. // 是否是多选
  303. if (c > 1){
  304. var urls = [];
  305. // 清空
  306. j.empty();
  307. $.each(choose,(i,t) => {
  308. urls.push(t.url);
  309. j.append('<img class="input-img-preview" src="' + t.url + '" style="height: 100px;margin: 8px;"/>');
  310. })
  311. i[0].value = JSON.stringify(urls);
  312. }else {
  313. i[0].value = j.children('.input-' + e +'-preview')[0].src = choose[0].url;
  314. }
  315. }
  316. });
  317. });
  318. /**
  319. * 列表页批量操作按钮组
  320. * @attr href 操作地址
  321. * @attr data-table table容器ID
  322. * @class confirm 类似系统confirm
  323. * @attr tips confirm提示内容
  324. */
  325. $(document).on('click', '.table-toolbar-btn', function () {
  326. var t = $(this),
  327. q = '',
  328. d = func.jsonParse(t.attr('table-data')),
  329. f = function (q) {
  330. admin.req(d.url, $.extend({}, d.param, {ids: q}), function (r) {
  331. if (r.code === 10000){
  332. notice.msg(r.message, {icon: 1}, function () {
  333. (t.attr('refresh')) ?
  334. // 刷新页面
  335. admin.refresh() :
  336. // 刷新表
  337. table.reload(d.table ? d.table :'dataTable', {});
  338. })
  339. }else {
  340. notice.msg(r.message, {icon: 2});
  341. }
  342. }, d.action || 'get');
  343. };
  344. if (!d) {
  345. notice.msg('请设置table-data参数', {icon: 3});
  346. return false;
  347. }
  348. if ($('.checkbox-ids:checked').length <= 0) {
  349. var checkStatus = table.checkStatus(d.table ? d.table :'dataTable'); // 动态传参
  350. if (checkStatus.data.length <= 0) {
  351. notice.msg('请选择要操作的数据', {icon: 3});
  352. return false;
  353. }
  354. for (var i in checkStatus.data) {
  355. if (i > 0) {
  356. q += ',';
  357. }
  358. q += checkStatus.data[i].id
  359. }
  360. } else {
  361. if (t.parents('form')[0]) {
  362. q = t.parents('form').serialize();
  363. } else {
  364. q = $('#pageListForm').serialize();
  365. }
  366. }
  367. if (typeof (t.attr('confirm')) == 'undefined') {
  368. f(q);
  369. } else {
  370. layer.confirm('您确定要执行此操作吗?', {title: false, closeBtn: 0}, function (index) {
  371. f(q);
  372. layer.close(index);
  373. });
  374. }
  375. return false;
  376. });
  377. /**
  378. * input编辑更新
  379. * @attr data-value 修改前的值
  380. * @attr focus-data 参数
  381. */
  382. $(document).on('focusout', '.focus-input,.table-focus-input', function () {
  383. var t = $(this),
  384. v = t.val(),
  385. c = t.attr('data-value'),
  386. d = func.jsonParse(t.attr('focus-data'));
  387. if (!d) {
  388. notice.msg('请设置focus-data参数!', {icon: 3});
  389. return false;
  390. }
  391. // 动态覆盖原始值
  392. d.param[t.attr('name')] = v;
  393. // 没有改变值
  394. if (c == v) return false;
  395. admin.req(d.url, d.param, (r) => {
  396. if (r.code === 10000){
  397. notice.msg(r.message, {icon: 1}, function () {
  398. (t.attr('refresh')) ?
  399. // 刷新页面
  400. admin.refresh() :
  401. // 刷新表
  402. table.reload('dataTable', {});
  403. })
  404. }else {
  405. notice.msg(r.message, {icon: 2});
  406. }
  407. }, d.action);
  408. });
  409. /**
  410. * 数据列状态修改
  411. */
  412. form.on('switch(ckDataTableState)', function (obj) {
  413. var t = $(this),
  414. v = obj.elem.checked ? 1 : 0,
  415. d = func.jsonParse(t.attr('switch-data'));
  416. if (!d) {
  417. notice.msg('请设置switch-data参数!', {icon: 3});
  418. return false;
  419. }
  420. admin.req(d.url, {status: v}, (r) => {
  421. if (r.code === 10000){
  422. notice.msg(r.message, {icon: 1}, function () {
  423. (t.attr('refresh')) ?
  424. // 刷新页面
  425. admin.refresh() :
  426. // 刷新表
  427. table.reload('dataTable', {});
  428. })
  429. }else {
  430. notice.msg(r.message, {icon: 2});
  431. $(obj.elem).prop('checked', !obj.elem.checked);
  432. }
  433. }, d.action);
  434. });
  435. });