var WX_BJ_REPORT = window.WX_BJ_REPORT || {}; (function(_) { if (_.BadJs) { return; }
var BADJS_WIN_ERR = 'BadjsWindowError'; var extend = function(source, destination) { for (var property in destination) { source[property] = destination[property] } return source }
_.BadJs = { uin: 0, mid: "", view: "wap", _cache: {}, _info: {}, _hookCallback: null, ignorePath: true, throw: function(e, extData) { this.onError(e, extData); throw e; },
onError: function(e, extData) { try {
if (e.BADJS_EXCUTED == true) { return; } e.BADJS_EXCUTED = true; var data = errToData(e); data.uin = this.uin; data.mid = this.mid; data.view = this.view; data.cmdb_module = 'mmbizwap';
if (!!extData) { data = extend(data, extData); }
if (data.cid) { data.key = "[" + data.cid + "]:" + data.key; }
if (data._info) { if (Object.prototype.toString.call(data._info) == "[object Object]") { data.msg += " || info:" + JSON.stringify(data._info); } else if (Object.prototype.toString.call(data._info) == "[object String]") { data.msg += " || info:" + data._info; } else { data.msg += " || info:" + data._info; } } if (typeof this._hookCallback == "function") { if (this._hookCallback(data) === false) { return } } this._send(data); return _.BadJs; } catch (e) { console.error(e); } }, winErr: function(event) { if (event.error && event.error.BADJS_EXCUTED) { return; } if (event.type === 'unhandledrejection') { _.BadJs.onError(createError(event.type, event.reason, "", "", "", event.reason)); }else{ _.BadJs.onError(createError(BADJS_WIN_ERR, event.message, event.filename, event.lineno, event.colno, event.error)); } }, init: function(uin, mid, view) { this.uin = uin || this.uin; this.mid = mid || this.mid; this.view = view || this.view; return _.BadJs; },
hook: function(fn) { this._hookCallback = fn; return _.BadJs; }, _send: function(data) {
if (!data.mid) { if (typeof window.PAGE_MID !== 'undefined' && window.PAGE_MID) { data.mid = window.PAGE_MID; } else { return; } } if (!data.uin) { data.uin = window.user_uin || 0; }
var flag = [data.mid, data.name, data.key].join("|"); if (this._cache && this._cache[flag]) { return } else { this._cache && (this._cache[flag] = true); this._xhr(data); } return _.BadJs; }, _xhr: function(data) {
var xmlobj; if (window.ActiveXObject) { try { xmlobj = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlobj = new ActiveXObject("Microsoft.XMLHTTP"); } catch (E) { xmlobj = false; } } } else if (window.XMLHttpRequest) { xmlobj = new XMLHttpRequest(); } var param = ""; for (var key in data) { if (key && data[key]) { param += [key, "=", encodeURIComponent(data[key]), "&"].join(""); } } if (xmlobj && typeof xmlobj.open == "function") { xmlobj.open("POST", "https://badjs.weixinbridge.com/report", true); xmlobj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); xmlobj.onreadystatechange = function(status) {}; xmlobj.send(param.slice(0, -1)); } else { var img = new Image(); img.src = "https://badjs.weixinbridge.com/report?" + param; } },
report: function(name, key, data) { this.onError(createError(name, key), data); return this; },
mark: function(info) { this._info = extend(this._info, info); }, nocache: function() { this._cache = false; return _.BadJs; } } function createError(name, msg, url, line, col, error) { return { name: name || "", message: msg || "", file: url || "", line: line || "", col: col || "", stack: (error && error.stack) || "", } }
function errToData(e) { var _stack = parseStack(e); return { name: e.name, key: e.message, msg: e.message, stack: _stack.info, file: _stack.file, line: _stack.line, col: _stack.col, client_version: "", _info: e._info } } function parseStack(e) { e._info = e._info || ""; var stack = e.stack || ""; var _stack = { info: stack, file: e.file || "", line: e.line || "", col: e.col || "", }; if (_stack.file == "") {
var stackArr = stack.split(/batb/); if (stackArr && stackArr[1]) { var match = /(https?://[^n]+):(d+):(d+)/.exec(stackArr[1]); if (match) {
if (match[1] && match[1] != _stack.file) { _stack.file && (e._info += " [file: " + _stack.file + " ]"); _stack.file = match[1]; } if (match[2] && match[2] != _stack.line) { _stack.line && (e._info += " [line: " + _stack.line + " ]"); _stack.line = match[2]; } if (match[3] && match[3] != _stack.col) { _stack.col && (e._info += " [col: " + _stack.col + " ]"); _stack.col = match[3]; } } } }
if (_stack && _stack.file && _stack.file.length > 0) { _stack.info = _stack.info.replace(new RegExp(_stack.file.split("?")[0], "gi"), "__FILE__") }
if (_.BadJs.ignorePath) { _stack.info = _stack.info.replace(/http(s)?:[^:n]*//ig, "").replace(/n/gi, ""); } return _stack; }
window.addEventListener && window.addEventListener('error', _.BadJs.winErr); window.addEventListener && window.addEventListener('unhandledrejection', _.BadJs.winErr); return _.BadJs; })(WX_BJ_REPORT); window.WX_BJ_REPORT = WX_BJ_REPORT;
function __moonf__() { if (window.__moonhasinit) return; window.__moonhasinit = true; window.__moonclientlog = []; if (typeof JSON != "object") { window.JSON = { stringify: function() { return ""; }, parse: function() { return {}; } }; } var moon_init = function() {
(function() { var inWx = (/MicroMessenger/i).test(navigator.userAgent); var inMp = (/MPAPP/i).test(navigator.userAgent); var _idkey = 121261; var _startKey; var _limit; var _badjsId; var _reportOpt; var _extInfo; var MOON_AJAX_NETWORK_OFFSET = 4; window.__initCatch = function(opt) { _idkey = opt.idkey; _startKey = opt.startKey || 0; _limit = opt.limit; _badjsId = opt.badjsId; _reportOpt = opt.reportOpt || ""; _extInfo = opt.extInfo || {}; _extInfo.rate = _extInfo.rate || 0.5; }
window.__moon_report = function(array, rate_opt) { var isAcrossOrigin = false; var href = ''; try { href = top.location.href; } catch (e) { isAcrossOrigin = true; } var rate = 0.5; if (!!_extInfo && !!_extInfo.rate) { rate = _extInfo.rate; } if (!!rate_opt && (typeof rate_opt == 'number')) { rate = rate_opt; } if ( (!(/mp.weixin.qq.com/).test(location.href) && !(/payapp.weixin.qq.com/).test(location.href)) || Math.random() > rate || !(inWx || inMp) || (top != window && !isAcrossOrigin && !(/mp.weixin.qq.com/).test(href)) ) {
} if (isObject(array)) array = [array]; if (!isArray(array) || _idkey == '') return; var data = ""; var log = []; var key = []; var val = []; var idkey = [];
if (typeof _limit != "number") { _limit = Infinity; } for (var i = 0; i < array.length; i++) { var item = array[i] || {}; if (item.offset > _limit) continue; if (typeof item.offset != "number") continue; if (item.offset == MOON_AJAX_NETWORK_OFFSET && !!_extInfo && !!_extInfo.network_rate && Math.random() >= _extInfo.network_rate) { continue; }
var k = _limit == Infinity ? _startKey : (_startKey + item.offset); log[i] = (("[moon]" + _idkey + "_" + k + ";") + item.log + ";" + getErrorMessage(item.e || {})) || ""; key[i] = k; val[i] = 1; } for (var j = 0; j < key.length; j++) { idkey[j] = _idkey + "_" + key[j] + "_" + val[j]; data = data + "&log" + j + "=" + log[j]; } if (idkey.length > 0) {
sendReport("POST", location.protocol + '//mp.weixin.qq.com/mp/jsmonitor?', "idkey=" + idkey.join(";") + "&r=" + Math.random() + "&lc=" + log.length + data);
var rate = 1;
if (_extInfo && _extInfo.badjs_rate) {
rate = _extInfo.badjs_rate;
}
if (Math.random() < rate) {
data = data.replace(/uin:(.)*|biz:(.)*|mid:(.)*|idx:(.)*|sn:(.)*|/, '');
if(!!_badjsId){
var _img = new Image();
var _src = 'https://badjs.weixinbridge.com/badjs?id=' + _badjsId + '&level=4&from=' + encodeURIComponent(location.host) + '&msg=' + encodeURIComponent(data);
_img.src = _src.slice(0, 1024);
}
if (typeof WX_BJ_REPORT != "undefined" && WX_BJ_REPORT.BadJs) {
for (var i = 0; i < array.length; i++) {
var item = array[i] || {};
if (item.e) {
WX_BJ_REPORT.BadJs.onError(item.e,{_info:item.log});
} else {
var name = /[^:;]*/.exec(item.log)[0];
WX_BJ_REPORT.BadJs.report(name, item.log, { mid: "mmbizwap:Monitor" });
}
}
}
} else {
for (var i = 0; i < array.length; i++) {
var item = array[i] || {};
if (item.e) {
item.e.BADJS_EXCUTED = true;
}
}
}
}
}
function isArray(obj) {
return Object.prototype.toString.call(obj) === '[object Array]';
}
function isObject(obj) {
return Object.prototype.toString.call(obj) === '[object Object]';
}
function getErrorMessage(e) {
var stack = e.stack + ' ' + e.toString() || "";
try {
if (!window.testenv_reshost) {
stack = stack.replace(/http(s)?://res.wx.qq.com/g, "");
} else {
var host = 'http(s)?://' + window.testenv_reshost;
var reg = new RegExp(host, 'g');
stack = stack.replace(reg, "");
}
var reg = //([^.]+)/js/(S+?).js(,|:)?/g;
while (reg.test(stack)) {
stack = stack.replace(reg, function(a, b, c, d, e, f) {
return c + d
});
}
} catch (e) {
stack = e.stack ? e.stack : ""
}
var ret = [];
for (o in _reportOpt) {
if (_reportOpt.hasOwnProperty(o)) {
ret.push(o + ":" + _reportOpt[o]);
}
}
ret.push("STK:" + stack.replace(/n/g, ""));
return ret.join("|");
}
function sendReport(type, url, data) {
if (!/^mp.weixin.qq.com$/.test(location.hostname)) {
var tmp = [];
data = data.replace(location.href, (location.origin || "") + (location.pathname || "")).replace("#wechat_redirect", "").replace("#rd", "").split("&");
for (var i = 0, il = data.length; i < il; i++) {
var a = data[i].split("=");
if (!!a[0] && !!a[1]) {
tmp.push(a[0] + "=" + encodeURIComponent(a[1]));
}
}
var _img = new window.Image();
_img.src = (url + tmp.join("&")).substr(0, 1024);
return;
}
var xmlobj;
if (window.ActiveXObject) {
try {
xmlobj = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xmlobj = new ActiveXObject("Microsoft.XMLHTTP");
} catch (E) {
xmlobj = false;
}
}
} else if (window.XMLHttpRequest) {
xmlobj = new XMLHttpRequest();
}
if (!xmlobj) return;
xmlobj.open(type, url, true);
xmlobj.setRequestHeader("cache-control", "no-cache");
xmlobj.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
xmlobj.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xmlobj.send(data);
}
})();
};
moon_init();
(!!window.__moon_initcallback) && (window.__moon_initcallback());
}
__moonf__();
if (!!window.addEventListener){
window.addEventListener("load",function(){
var MOON_SCRIPT_ERROR_KEY_OFFSET = 1;
var ns = document.querySelectorAll("[reportloaderror]");
for(var ni=0,nl=ns.length;ni
带工作流的springboot后台管理项目,一个企业级快速开发解决方案
一直以来,总有小伙伴问说:诶,有没有什么好的项目推荐啊,想参考使用。
一般用途无非如下几种情况:
-
自学练手:从书本和博客的理论学习,过渡到实践练手
-
吸收项目经验,找工作写简历时能参考:毕竟有时候确实没有实际项目经验可写,那研究开源项目的经验就非常宝贵了
-
毕业设计:想找点参考、找点选题、找点灵感
-
甚至还有想接私活参考的:想找一个脚手架快速开发
后台管理类项目也是企业中最常见的实战项目类,掌握它是最基本的
后台管理类项目
项目名称: JeeSite
项目介绍:
这是个典型的SSM后台管理项目(不是有很多小伙伴让推荐SSM项目练手嘛),基于经典技术组合(Spring MVC、Shiro、MyBatis、Bootstrap UI等)开发,适合学习练手。
而且它作为一个典型的后台管理系统,要素基本都有,包括:组织机构、角色用户、权限授权、数据权限、内容管理、工作流等。
尤其要提的就是最后的工作流模块,它可以实现提工单、审核/审批等流程,这个在后台管理类项目里是必备的模块。
技术选型
-
主框架:Spring Boot 2.2、Spring Framework 5.2、Apache Shiro 1.6、J2Cache
-
持久层:Apache MyBatis 3.5、Hibernate Validator 6.0、Alibaba Druid 1.1
-
视图层:Spring MVC 5.2、Beetl 3.1(替换JSP)、Bootstrap 3.3、AdminLTE 2.4
-
前端组件:jQuery 3.4、jqGrid 4.7、layer 3.1、zTree 3.5、jquery validation
-
工作流引擎:Flowable 6.5、符合 BPMN 规范、在线流程设计器、中国式工作流
-
技术选型详情:http://jeesite.com/docs/technology/
平台介绍
JeeSite 快速开发平台,不仅仅是一个后台开发框架,它是一个企业级快速开发解决方案,基于经典技术组合(Spring Boot、Spring MVC、Apache Shiro、MyBatis、Beetl、Bootstrap、AdminLTE)采用经典开发模式,让初学者能够更快的入门并投入到团队开发中去。在线代码生成功能,包括模块如:组织机构、角色用户、菜单及按钮授权、数据权限、系统参数、内容管理、工作流等。采用松耦合设计,模块增减便捷;界面无刷新,一键换肤;众多账号安全设置,密码策略;文件在线预览;消息推送;多元化第三方登录;在线定时任务配置;支持集群,支持SAAS;支持多数据源;支持读写分离、分库分表;支持微服务应用。
JeeSite 快速开发平台的主要目的是能够让初级的研发人员快速的开发出复杂的业务功能(经典架构会的人多),让开发者注重专注业务,其余有平台来封装技术细节,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。
JeeSite 自 2013 年发布以来已被广大爱好者用到了企业、政府、医疗、金融、互联网等各个领域中,JeeSite 架构精良、易于扩展、大众思维的设计模式、工匠精神打磨每一个细节,深入开发者的内心,并荣获开源中国《最受欢迎中国开源软件》奖杯,期间也帮助了不少刚毕业的大学生,教师作为入门教材,快速的去实践。关注我是程序汪
JeeSite4 的升级,作者结合了多年总结和经验,以及各方面的应用案例,对架构完成了一次全部重构,也纳入很多新的思想。不管是从开发者模式、底层架构、逻辑处理还是到用户界面,用户交互体验上都有很大的进步,在不忘学习成本、提高开发效率的情况下,安全方面也做和很多工作,包括:身份认证、密码策略、安全审计、日志收集等众多安全选项供你选择。努力为大中小微企业打造全方位企业级快速开发解决方案。
平台优势
JeeSite 整体架构清晰、稳定技术先进、源代码书写规范、经典技术会的人多、易于维护、易于扩展、安全稳定。
JeeSite 功能全,JeeSite 的知识点非常多,也非常少。因为她使用的都是一些通用的技术,通俗的设计风格,大多数基础知识点多数人都能掌握,所以每一个 JeeSite 的功能点都非常容易掌握。只要你学会使用这些功能和组件的应用,就可以顺利的完成系统开发了。
JeeSite 是一个低代码开发平台,具有较高的封装度、扩展性,封装不是限制你去做一些事情,而是在便捷的同时,也具有较好的扩展性,在不具备一些功能的情况下,JeeSite 提供了扩展接口,提供了原生调用方法。
大家都在用 Spring ,在学习 Spring 架构的优点,Spring 提供了较好的扩展性,可又有多少人去修改它的源代码呢,退一步说,大家去修改了 Spring 的源码,反而会对未来升级造成很大困扰,您说不是呢?这样的例子很多,所以不要纠结,JeeSite 也一样具备强大的扩展性。
发展至今 JeeSite 平台架构已经非常稳定,JeeSite 是一个专业的平台,是一个让你使用放心的平台。
源码地址
源码地址获取:
发布者:admin,如若转载,请注明出处:https://ai1024.vip/2900.html