# 常用的数据信息 ## 其他 > 维护人员: youhong.ai + 缓存地址: `/commcache/cacheMonitor.jsp` + 移动端流程模拟地址: `/spa/workflow/static4mobile/index.html#/center/doing` ## 常用代码 ### 前端 **1.获取用户信息** > 维护人员:youhong.ai ```javascript const userInfo = JSON.parse(localStorage.getItem("theme-account")) ``` **2.ecode访问上传的resource静态文件** ```javascript let src = "/cloudstore/release/${appId}/resources/" ``` **3.获取url参数** > 维护人员: youHong.ai ```javascript getQueryString = (name) => { let reg = new RegExp("(^|&|\/?)" + name + "=([^&]*)(&|$)", "i"); let searchStr = window.location.href if (searchStr.startsWith('&')) { searchStr = searchStr.substr(1) } search = searchStr.match(reg) if (search != null) { return unescape(search[2]); } return null; } ``` **4.ajax请求** > 维护人员: youHong.ai ```javascript class ApiUtils { static request = (url, type = "GET", data, isAsync = true, success = () => { }, error = () => { }, complete = () => { }, contentType = 'application/json', beforeSend = () => { }) => { let options = { url, type, dataType: "json", contentType, async: isAsync, data, beforeSend, success, error, complete, } if (contentType == 'application/json') { options.data = JSON.stringify(data) } return $.ajax(options) } } ``` **5.通过js获取react组件,操作组件内部数据** ```javascript function FindReact(dom, traverseUp = 0) { const key = Object.keys(dom).find(key => { return key.startsWith("__reactFiber$") // react 17+ || key.startsWith("__reactInternalInstance$"); // react <17 }); const domFiber = dom[key]; if (domFiber == null) return null; // react <16 if (domFiber._currentElement) { let compFiber = domFiber._currentElement._owner; for (let i = 0; i < traverseUp; i++) { compFiber = compFiber._currentElement._owner; } return compFiber._instance; } // react 16+ const GetCompFiber = fiber => { let parentFiber = fiber.return; while (typeof parentFiber.type == "string") { parentFiber = parentFiber.return; } return parentFiber; }; let compFiber = GetCompFiber(domFiber); for (let i = 0; i < traverseUp; i++) { compFiber = GetCompFiber(compFiber); } return compFiber.stateNode; } // 用法 const someElement = document.getElementById("someElement"); const myComp = FindReact(someElement); myComp.setState({test1: test2}); ``` **6.ecode集成iconfont** ```css /*修改url,字体文件上传到cloudstore/iconfont/xx/下,没有目录自己创建*/ /*修改font-family,命名为其他名称,防止与系统自带的或与其他iconfont冲突,并将修改后的css文件内容copy到ecode中,将文件夹发布,并且将css样式文件前置加载*/ @font-face { font-family: "cus_iconfont"; /* Project id 3789451 */ src: url('/cloudstore/iconfont/pcn/iconfont.woff2?t=1669223019749') format('woff2'), url('/cloudstore/iconfont/pcn/iconfont.woff?t=1669223019749') format('woff'), url('/cloudstore/iconfont/pcn/iconfont.ttf?t=1669223019749') format('truetype'); } /*修改iconfont类名为font-family的名称*/ .cus_iconfont { font-family: "cus_iconfont" !important; font-size: 16px; font-style: normal; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } ``` **7.ecode组件样式引入(非前值加载)** > 维护人员 youhong.ai 在ecode开发时,需要编写css样式文件,但是偶尔会出现className与其他组件的className一样,导致样式发生覆盖或影响原来的组件的样式(前置加载会将css文件合并到init。css中,并且会全局引入,所以可能会造成样式污染) 在ecode中,找到config文件夹,找到config.js文件,可以看到的是js文件属于前置加载,我们只需要在这个js文件中将css文件动态添加到页面中就可以了 ```js $(() => { if (window.location.hash.indexOf("${appId}_organization-chart") !== -1) { loadCssArr(['index.css']) /* ******************** 下面两个文件为开发新页面时候,如果用户登陆超时,用于集成系统登陆弹窗的依赖和css样式文件 ******************* */ // loadJs('/spa/portal/public/index.js') // loadCss('/spa/portal/public/index.css') // 使用方法,当请求结果返回的errorCode === '002',然后调用下面的方法 // doLoginPop() } }) /** * 加载当前appId下的css资源文件 * @param cssArr css文件名称数组 (所有的css会被合并为index.css) */ function loadCssArr(cssArr) { cssArr.forEach(item => { let href = '/cloudstore/release/${appId}/' + item; loadCss(href) }) } /** * 加载自定义的css样式文件,可以用于加载上传到resources文件加下的css文件,需要自己拼接路径 * @param url 样式文件的路径 */ function loadCss(url) { const head = document.getElementsByTagName('head')[0]; const link = document.createElement('link'); link.type = 'text/css'; link.rel = 'stylesheet'; link.href = url; head.appendChild(link); } /** * 加载当前ecode文件夹下的js文件,一般js文件会被打包成index.js文件 * @param jsArr js文件名数组 */ function loadJsArr(jsArr) { jsArr.forEach(item => { let src = href = '/cloudstore/release/${appId}/' + item; loadJs(src) }) } /** * 加载自定义js文件,可用于加载第三方js库 * @param url js文件路径 * @param callback 加载完成后回调方法 */ function loadJs(url, callback) { let script = document.createElement('script'), fn = callback || function () { }; script.type = 'text/javascript'; //IE if (script.readyState) { script.onreadystatechange = function () { if (script.readyState == 'loaded' || script.readyState == 'complete') { script.onreadystatechange = null; fn(); } }; } else { //其他浏览器 script.onload = function () { fn(); }; } script.src = url; document.getElementsByTagName('head')[0].appendChild(script); } ``` ### 数据库 **备份mysql数据库** > 维护人员: youHong.ai ```shell mysqldump -uroot -p'passowrd' --single-transaction -ApiResult -E --databases ecology_dev> /tmp/ecology_dev_back.sql ``` **mysql常用视图** ```sql -- 流程类型视图,可用于数据集成或流览按钮 create or replace view workflow_type_info_view as select wb.id, wb.workflowname, wt.typename, wb.workflowdesc, (IF(wb.version is null, 1, wb.version)) version from workflow_base wb RIGHT JOIN workflow_type wt on wb.workflowtype = wt.id; -- 流程表单视图,用于流览按钮或数据集成,配置流程类型表可以用字段联动获取流程表表名 create or replace view workflow_table_view as select base.id, base.workflowname, base.formid, bill.tablename, (IF(base.version is null, 1, base.version)) version from workflow_bill bill join workflow_base base on base.formid = bill.id; -- 流程明细表信息,可用流程主表查询对应的明细表信息,用于流览框 create or replace view workflow_detail_table_view as select CONCAT(bill.id, '-', base.id) id, bill.id bill_id, base.id workflow_id, base.workflowname, base.formid main_formid, bill.tablename from workflow_billdetailtable bill join workflow_base base on base.formid = bill.billid; -- 流程和建模字段视图,更具流程和建模的billid可以查询流程和建模中的字段信息 create or replace view workflow_field_table_view as select wb.id, wb.fieldname, concat(ht.indexdesc, ':', wb.fieldname) indexdesc, ( case when wb.detailtable is null then (select distinct tablename from workflow_bill where id = wb.billid) when wb.detailtable = '' then (select distinct tablename from workflow_bill where id = wb.billid) else wb.detailtable end ) tablename, billid, ( case when wb.detailtable = '' then 'main table' when wb.detailtable is null then 'main table' else wb.detailtable end ) showtablename, (case when wb.fieldhtmltype = '1' then '单行文本框' when wb.FIELDHTMLTYPE = '2' then '多行文本框' when wb.FIELDHTMLTYPE = '3' then '流览框' when wb.FIELDHTMLTYPE = '4' then 'check框' when wb.FIELDHTMLTYPE = '5' then '选择框' else '附件上传' end) fieldhtmltype from workflow_billfield wb left join htmllabelindex ht on wb.fieldlabel = ht.id; -- 建模表信息视图 create or replace view mode_bill_info_view as select bill.id, bill.tablename, hti.indexdesc from workflow_bill bill left join htmllabelindex hti on hti.id = bill.namelabel where bill.id < 0 and bill.tablename like 'uf%'; -- 流程节点信息视图 create or replace view workflow_node_info_view as select distinct nb.id, nb.nodename, (case when wb.version is null then 1 else wb.version end) version, fn.workflowid from workflow_nodebase nb left join workflow_flownode fn on nb.id = fn.nodeid left join workflow_base wb on wb.id = fn.workflowid; ``` **oracle常用视图,与mysql对应** ```sql create or replace view workflow_type_info_view as select wb.id, wb.workflowname, wt.typename, wb.workflowdesc, (IF(wb.version is null, 1, wb.version)) version from workflow_base wb RIGHT JOIN workflow_type wt on wb.workflowtype = wt.id / create or replace view workflow_table_view as select base.id, base.workflowname, base.formid, bill.tablename, (IF(base.version is null, 1, base.version)) version from workflow_bill bill join workflow_base base on base.formid = bill.id / create or replace view workflow_detail_table_view as select (bill.id || '-' || base.id) id, bill.id bill_id, base.id workflow_id, base.workflowname, base.formid main_formid, bill.tablename from workflow_billdetailtable bill join workflow_base base on base.formid = bill.billid / create or replace view workflow_field_table_view as select wb.id, wb.fieldname, (ht.indexdesc || ':' || wb.fieldname) indexdesc, ( case when wb.detailtable is null then (select distinct tablename from workflow_bill where id = wb.billid) when wb.detailtable = '' then (select distinct tablename from workflow_bill where id = wb.billid) else wb.detailtable end ) tablename, billid, ( case when wb.detailtable = '' then 'main table' when wb.detailtable is null then 'main table' else wb.detailtable end ) showtablename, (case when wb.fieldhtmltype = '1' then '单行文本框' when wb.FIELDHTMLTYPE = '2' then '多行文本框' when wb.FIELDHTMLTYPE = '3' then '流览框' when wb.FIELDHTMLTYPE = '4' then 'check框' when wb.FIELDHTMLTYPE = '5' then '选择框' else '附件上传' end) fieldhtmltype from workflow_billfield wb left join htmllabelindex ht on wb.fieldlabel = ht.id / create or replace view mode_bill_info_view as select bill.id, bill.tablename, hti.indexdesc from workflow_bill bill left join htmllabelindex hti on hti.id = bill.namelabel where bill.id < 0 and bill.tablename like 'uf%' / create or replace view workflow_node_info_view as select distinct nb.id, nb.nodename, (case when wb.version is null then 1 else wb.version end) version, fn.workflowid from workflow_nodebase nb left join workflow_flownode fn on nb.id = fn.nodeid left join workflow_base wb on wb.id = fn.workflowid / ``` **sqlserver常用视图,与mysql对应** ```sql create view workflow_type_info_view as select wb.id, wb.workflowname, wt.typename, wb.workflowdesc, ( IF(wb.version is null, 1, wb.version)) version from workflow_base wb RIGHT JOIN workflow_type wt on wb.workflowtype = wt.id; create or replace view workflow_table_view as select base.id, base.workflowname, base.formid, bill.tablename, ( IF(base.version is null, 1, base.version)) version from workflow_bill bill join workflow_base base on base.formid = bill.id; create or replace view workflow_detail_table_view as select (bill.id + '-' + base.id) id, bill.id bill_id, base.id workflow_id, base.workflowname, base.formid main_formid, bill.tablename from workflow_billdetailtable bill join workflow_base base on base.formid = bill.billid; create view workflow_field_table_view as select wb.id, wb.fieldname, (ht.indexdesc + ':' + wb.fieldname) indexdesc, ( case when wb.detailtable is null then (select distinct tablename from workflow_bill where id = wb.billid) when wb.detailtable = '' then (select distinct tablename from workflow_bill where id = wb.billid) else wb.detailtable end ) tablename, billid, ( case when wb.detailtable = '' then 'main table' when wb.detailtable is null then 'main table' else wb.detailtable end ) showtablename, (case when wb.fieldhtmltype = '1' then '单行文本框' when wb.FIELDHTMLTYPE = '2' then '多行文本框' when wb.FIELDHTMLTYPE = '3' then '流览框' when wb.FIELDHTMLTYPE = '4' then 'check框' when wb.FIELDHTMLTYPE = '5' then '选择框' else '附件上传' end) fieldhtmltype from workflow_billfield wb left join htmllabelindex ht on wb.fieldlabel = ht.id; create view mode_bill_info_view as select bill.id, bill.tablename, hti.indexdesc from workflow_bill bill left join htmllabelindex hti on hti.id = bill.namelabel where bill.id < 0 and bill.tablename like 'uf%'; create view workflow_node_info_view as select distinct nb.id, nb.nodename, (case when wb.version is null then 1 else wb.version end) version, fn.workflowid from workflow_nodebase nb left join workflow_flownode fn on nb.id = fn.nodeid left join workflow_base wb on wb.id = fn.workflowid; ``` ### 后端 **1.后端根据请求获取登录用户信息** > 维护人员:xuanran.wang ```java //@Context HttpServletRequest request, @Context HttpServletResponse response User logInUser=HrmUserVarify.getUser(request,response); // 传入id会将此人员信息带出 User user=new User(id); // 获取人员id user.getUID(); ``` **2.发送邮件** > 维护人员:xuanran.wang ```java /** *