提交 2af7f798 编写于 作者: ibizdev's avatar ibizdev

ibiz4j 发布系统代码 [ibz-disk,存储]

上级 42571a8e
......@@ -12,3 +12,4 @@
**.iml
*.jar
*.log
.DS_Store
## v7.0.0-alpha.22 [2020-11-22]
### Bug修复
修复表单项值校验错误信息提示问题 [7dcad593](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/7dcad593036a9c6ea0612bdbf2e99fc1bee20062)
修复表单新建和更新默认值问题 [426f7930](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/426f793037ca228e3ae2b6449df9c10359d4844a)
修复表格新建更新默认值问题 [73a7f288](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/73a7f288493f8606a3bcf3a697c68c86171d12f2)[daac8796](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/daac8796532556617979fbfa91dc78033cc31215)
修复搜索表单新建默认值问题 [940c4e6b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/940c4e6b854f7f32de41656535c329da683ca631)
修复图表加载逻辑问题 [b35ee838](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/b35ee83875787b3edb1df20c92c932b55972e092)
修复应用菜单计算权限异常问题 [c3335e88](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/c3335e8858ec1137ca65d35114f3a060ae56e2ba)
修复表单数据对象报错问题 [5722dbb4](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/5722dbb48122dbc60c8904b634995c906d10a456)
修复主信息属性映射表单项名称报错问题 [1a948e6d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/1a948e6d52cf133dae90990cd3c2b0262559fd60)[b2f366a0](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/b2f366a05fbf2b1ed00d199ad0856a0ac7099809)[81f9ddee](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/81f9ddee9a859451ed860d155e2ea7d265ee3457)
修复表格分页加载未重置当前页为第一页问题 [8cc91599](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/8cc91599c6ef83e3a1e387d2d8f8857443452af9)
修复图表无数据刷新问题 [485463d8](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/485463d8a13522d87a240eea01faa35da3ae3e1b)
修复多数据选择视图未引入选择视图面板问题 [ed3130dd](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/ed3130dd859417e3659be3ba8af914e3d8622612)
修复视图viewparams为字符串时处理逻辑异常问题 [55d26f5f](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/55d26f5f6729e3bb3ef5211d0459a8503ac3250f)
修复看板视图整合参数问题 [9e4828f1](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/9e4828f1d3be520dfe2c53d4938f13bf569a0d06)
修复表格排序属性异常问题 [5e746632](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/5e7466326a19a411662e10f959d946152eee511c)
修复实体处理逻辑异常问题 [29e2e495](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/29e2e4959afc5a1fcf36e374dd357212fe86f382)
### 功能新增及优化
#### 模板
新增图表视图添加快速分组代码表和快速搜索栏 [b3305963](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/b33059638134e4245aab6c6498a721c87aa8ad61)[99711fd0](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/99711fd0d50384e03645ff0948d551d5a9b63691)
新增标签(地址栏插件) [22271ea9](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/22271ea9e5d636dbbc3850511cdce36089bc7dfa)[a348ff6b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/a348ff6b11b4348cf191a59b422e85e8f67d304e)
新增复合表单项值规则 [0b838bdf](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/0b838bdf805fd48e2c898fc63a296cd4b01151dc)[a88f78dd](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/a88f78dda0ff2c3bacf58c4bb04cb1ede539792a)
新增表单按钮无图标使用界面行为图标逻辑 [a214c5b8](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/a214c5b88bf0bb1d669b468991180ddfc4b7e4f8)[90cbf4b8](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/90cbf4b8c3474922e6b065ba70e3138191491947)
新增列表部件操作列界面行为支持 [4a2664b1](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/4a2664b1525f8850cc5c39a541c7bc907a6d81b8)[0586ad9d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/0586ad9d1534caa06eaecb3484c73f7dc9f0fdfa)[63dc0dab](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/63dc0dabb1adcf0a56ebe9d97f9bb1ece562fad6)[6ee19a63](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/6ee19a63f87346f7edd0fc1c7d95ce4b212357f7)
新增数据视图部件操作列界面行为支持 [ef18acdf](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/ef18acdf5b10264fd40fa43a3375aeec2830c71b)[218333d5](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/218333d54e596ed97b62027bd35340b96e35b5f5)
新增关系界面表格保存提示内容显示 [50b9a9f7](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/50b9a9f7925359aa84e23ffa27bf0d7a9a527cbd)
新增列表批操作工具栏和快速工具栏支持 [ddb1d067](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/ddb1d067b299cab6eab9c049940da5623bd42298)[d56c3d79](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/d56c3d79747baac4e6d0aa1501873a4680dd1291)
新增数据视图批操作工具栏和快速工具栏支持 [aba0f9e0](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/aba0f9e00e50f18b804297bb3a440812d8a32f23)[9f8fdce8](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/9f8fdce8e73e02b223524812ced0300282429072)[ef753f43](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/ef753f43754c5ff29b0ee2f1f9986b5bbd44cac1)[dac712a2](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/dac712a2a2c84653deaab1cdfb0680d2b555a43f)[6e2bccea](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/6e2bccea860951bb1ea85b2a1be8280189eaca31)[974aadd1](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/974aadd1fe47768d33a7e508d81323be9c6cd7fd)
新增工作流动态操作视图支持 [065a8dce](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/065a8dce5550b051245793e58af5bc5484464e07)[6f9a0ee3](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/6f9a0ee3536f4e5cb6d32bcdc79a4c9aec1afd9e)[5fd6366d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/5fd6366d50dde1fe2e8168e23bfb6d6964792ca0)[a40bf66b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/a40bf66b9066197c9a2757e66a45f00e3e3eacb5)[0cdd5713](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/0cdd571311b0f4d379977d836d6ca7c1f287c55c)[21264471](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/21264471b30b713bdc873ca87d66ae5979b39ef8)[bc85a97b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/bc85a97bdeb18bdc70c0f71ccc9f29e1448b5399)[fcea460c](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/fcea460ce3c320c0c02556cf4cb997d5b36a64f2)[729bc0a6](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/729bc0a680203e81dc3e6118ebfe72bc40784c63)[b1a569ac](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/b1a569acf82aa3e777cfa6d596615c6048c2f980)[81857c4a](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/81857c4ac443137a49649023dfc1ac9f7136c10e)
新增表格(透视表)插件 [4f57e1ba](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/4f57e1baad8881fb3a069fb293044b16daa08e44)
新增看板视图支持看板展开与收缩 [104bde80](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/104bde80f844cf4f985e76d234095c9857d4ea59)
新增数据服务查询数据集(post方式)方法 [c2fe9f3b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/c2fe9f3bf8bedd12255650b3969817123b6701de)
新增代码表服务图标属性 [20c54b64](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/20c54b6409d5e3343a74c84ef7241f868d7ddae9)
新增实体地图视图及地图部件 [9943b1c0](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/9943b1c01f1146b95dd45464a2896b03c85783e8)
新增实体地图视图(部件视图) [f3887778](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/f3887778d471cbec33eddf56756e2d4d07a1818f)
新增地图定位组件 [84297814](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/842978148e116dfef3b044cfcce934f5468d16d5)[fd2ae711](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/fd2ae71184646ad13a5d5a2ac50701bbdc7cd0f5)[9742d2a0](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/9742d2a0f2210fd4a5e73e2254985cfc21065761)
优化前台调用界面行为关闭编辑或弹出视图逻辑 [8d191a79](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/8d191a790a52ed46985e1f8faf8de8266cfa08d8)
优化表单保存提示信息 [93cdc68b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/93cdc68bc84486c2a4df70ab144eeadae78ab1a3)
优化表格值规则校验 [e3bf8fd1](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/e3bf8fd10f52ff1d3d1746cc675780a9e1d8f0ce)[a6544f41](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/a6544f41e7e547d9b18893d2b990e0e7ea04458e)[92f12d80](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/92f12d801cc4e540c7b1034782faed5b6459132c)
优化表单值规则校验 [e100c8eb](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/e100c8eb79eb3d0d9646d93b929698d159a43200)[5ed59675](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/5ed59675e2a8c515054804d9e40a4de83ff30bf7)[19d639ee](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/19d639ee7e18e04d678898f8e499b61b18812cb7)
优化表格、表单属性值规则校验异常捕获逻辑 [8f78ffad](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/8f78ffadaa42c2ca1ecb3fac94022df7b6f795a8)[2cbedd77](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/2cbedd7759be86933b3136ec2d43df4f0b959a2d)[5f719edd](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/5f719edd3bfce6abff63ba229fc79abaaa5714d7)[53b99003](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/53b99003e1bfa941d0175ed263825490eacb5b80)
优化直接内容项html类型 [c9712800](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/c9712800819554064b8aace92306e74a4cd41c30)
优化表单、表格提示信息内容 [cfefe47d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/cfefe47df2321cbdc5c9149d709e3de6ae3af153)[6a908895](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/6a908895a4cad9af3b6d2baa8f0b342c06a45ea5)[ff815b76](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/ff815b766207692483420b3fb3fdc48e1af1a716)
优化表格删除提示信息内容 [3dc02183](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/3dc021833cac72e7e37c963c0f46ed7fa9d3b97c)
优化编辑器占位提示 [60e296d9](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/60e296d94d1c331ff1f6d4c920ea7b929de36e2a)[3128fdbf](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/3128fdbf55e7dfbb5f6b9438137ef87d549743e8)
优化列表部件数据分组逻辑 [c8a74e10](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/c8a74e10c6f3fa4b15dba8141c4f52509b1ee5eb)[55a3fb4b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/55a3fb4b649c50a645670ab8dda7d8aad7fea802)
优化表格部件数据分组逻辑 [75624d3e](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/75624d3e042a7a15d55568ae92c1578948ad1b13)[7873329d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/7873329de8c3f0805d1b72945b43b14220f61bc7)[982a2c2b](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/982a2c2b48fe71c326b68d7020c22a4daebb4a89)[276f90d3](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/276f90d3b2bd6cc18899cadec9d11fc2e8236433)[d6377294](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/d63772945d4db25f2a743d355e1b648992cf0048)[d326d83a](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/d326d83a2030aa17a04aa2e482b44acf4973e5ad)[b8ad5bfd](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/b8ad5bfde4fdfc13765a2e25d48a7583b0dcad1a)[641a67f4](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/641a67f4183997c45dfe3b4775cd1b75b315b195)[8db35ec3](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/8db35ec34c00a47d67f7f864461e8b005988e597)[faecb1cc](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/faecb1cc20142420a79a57f9cef5b71053a1d98d)
优化实体工作流动态导航表格视图逻辑 [909f0cd4](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/909f0cd48133b974f2a8d634a252f0dd7248ea5c)[1e9a4fe9](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/1e9a4fe92e64a86aea9b730da8f9b7a72ee0ee11)[899e6882](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/899e68821c06e2d584c5b03304ca11d6d6edbc6b)[64d99a8c](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/64d99a8ceb2c942dbf9c1e6089718d2c53bffc86)[729bc0a6](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/729bc0a680203e81dc3e6118ebfe72bc40784c63)[e57c1f14](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/e57c1f141e256f4813c347197461bccaad9c1194)[bd46e456](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/bd46e4565331e8bb4757514d80b17615186db1d5)[f3e4468a](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/f3e4468af140170e4dd7c5f5882ff0bcc9621b81)
优化实体工作流动态编辑视图逻辑 [909f0cd4](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/909f0cd48133b974f2a8d634a252f0dd7248ea5c)[1e9a4fe9](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/1e9a4fe92e64a86aea9b730da8f9b7a72ee0ee11)[899e6882](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/899e68821c06e2d584c5b03304ca11d6d6edbc6b)[e89a302d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/e89a302d477433808d61b4cf7ec4f62455a8aeb7)[91feb5aa](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/91feb5aabcef545b20bc3de935dcb0cd2f92f1f7)[9c892670](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/9c8926700f7c6526bafd9a84ea00c861f731f521)[ff0c64f1](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/ff0c64f19a075d13f2258c80fcc19dec77c4ac7f)[729bc0a6](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/729bc0a680203e81dc3e6118ebfe72bc40784c63)[bd46e456](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/bd46e4565331e8bb4757514d80b17615186db1d5)[f3e4468a](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/f3e4468af140170e4dd7c5f5882ff0bcc9621b81)
优化面板标签代码表发布值分隔符 [6a0029df](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/6a0029dfcd0d5970114d0040d1712775105ec4f3)
优化数据图表部件增加高度发布逻辑 [aca0084a](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/aca0084a00011cec55096984293425de4fdef57e)
优化数据看板部件逻辑 [160dedcd](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/160dedcdd4c66e25bc83abebf3e471beebefa857)[d005eeba](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/d005eeba57c974063a1df0cca914d2c7b012d470)[d10cf154](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/d10cf154f0887dcd011cdd99f711bdcc98e64205)
优化评分器编辑器支持代码表逻辑 [e2f0d18f](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/e2f0d18f5820a7acbf198635de190843da91467a)
优化看板视图部件嵌入面板数据处理 [b07ba68c](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7/commit/b07ba68c5d1f1823fce2e52d985cbcc3a7fb85c4)
#### 基础文件
修复图表视图、图表部件视图获取快速分组和搜索栏参数及样式 [cc9ec9d8](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/cc9ec9d88483c7f14ccd519897778635b9385b14)
修复工具栏按钮异常问题 [f66edc45](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/f66edc45e909ec0d1fbb47861c8ea336819ce0aa)
修复修复下拉列表框不加载数据异常 [503581d7](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/503581d771cbb628a5cfb170bb10e68808cbaf5b)
修复关系界面内嵌视图出现不加载的情况 [c1d6db61](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/c1d6db6130ff6a5768f9d982e75949cde86307f0)
新增部件服务增加根据后台标识获取前台数据标识名称能力 [a07d7088](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/a07d70887e5044f415a29d92f136ef910231a2dd)
新增图标绘制组件 [3a160350](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/3a1603502740cde5ee12051bd2ee3c76abe2b554)[9653dd15](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/9653dd15cdef7b97ce0c022d78c6236d3bf9d8fe)
新增响应头错误状态汇总 [3cb2a17f](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/3cb2a17f78d262efab0914a3d025de29e36d5641)
新增透视表表格插件 [dbebc115](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/dbebc115cfa9d90cca2518db27646c935fc5c11c)
新增代码表获取代码表项能力 [06c53dca](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/06c53dca2963165c8593cf2b7f2ba6f9e0f13f0c)[f856c55f](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/f856c55f6983bfab490848dfefed0a8ca29bac9b)
新增实体地图视图引擎 [5ccb40ba](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/5ccb40ba780548f7758e0cf4027fb8a16affc56d)
新增实体地图视图(部件视图)引擎 [da07aede](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/da07aede9151f474740da1cabcaa10e8bc1b3749)
新增地图定位组件 [b76bf4ba](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/b76bf4ba09630d477e1a75637a76b39974b8ff2f)[19c862e7](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/19c862e71eabdf4e10a56118ea32c3f23793e68b)[1683f20e](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/1683f20e070d0f2a1c738929ca4eb018d61eaea0)
优化数据选择下拉时清空旧数据 [a42584a4](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/a42584a4235a0beb0d155b47890e5e685d9eb5ac)
优化视图消息样式 [22406733](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/22406733fecb566929770e688e5d06fa7b6ed5d1)
优化代码表组件增加图片识别 [853d4ad4](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/853d4ad406a35cfb013dbc18188aeb45d148b8b6)[bc879205](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/bc879205eb35dba743974a9af189de0292dd4979)
优化工作流动态编辑视图加载逻辑 [19760cf6](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/19760cf6f32f9bb47aa75ffe13ca5db8639cc250)
优化引用avue.min.js的文件路径 [e4a9d11d](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/e4a9d11db906cc8e18a0f290cb66fd2c3fc277a1)
优化评分器编辑器支持代码表逻辑 [28721171](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/28721171ffa8d5adae6d9b567838041e320c5767)[453c1e6c](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/453c1e6c79b31a49d189c40a4537a60fa0dd0023)
优化表单项label长度过长显示异常和支持label显示html [fc754a29](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/fc754a294d553d70d4e634df940069012a16a7e1)[ed804eb6](http://demo.ibizlab.cn/ibizr7pfstdtempl/ibizvuer7res/commit/ed804eb6b5bccab109b92edd5419310363bc0b68)
## v7.0.0-alpha.21 [2020-10-31]
### Bug修复
......
......@@ -9,8 +9,7 @@
"dev-build": "node --max_old_space_size=8102 ./node_modules/@vue/cli-service/bin/vue-cli-service build --mode development",
"test:unit": "vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint",
"format-code": "prettier-eslint --write \"src/**/*.js\" \"src/**/*.vue\" \"src/**/*.tsx\" \"src/**/*.ts\" \"src/**/*.less\""
"lint": "vue-cli-service lint"
},
"dependencies": {
"@fullcalendar/core": "^4.4.0",
......@@ -30,6 +29,7 @@
"font-awesome": "^4.7.0",
"ibiz-gantt-elastic": "^1.0.17",
"ibiz-vue-lib": "^0.1.13",
"ibiz-vue-pivottable": "^1.0.6",
"interactjs": "^1.9.4",
"moment": "^2.24.0",
"path-to-regexp": "^6.1.0",
......@@ -38,6 +38,7 @@
"tinymce": "4.8.5",
"view-design": "4.2.0",
"vue": "^2.6.10",
"vue-amap": "^0.5.10",
"vue-class-component": "^7.0.2",
"vue-grid-layout": "^2.3.7",
"vue-i18n": "^8.15.3",
......@@ -67,12 +68,5 @@
"script-loader": "^0.7.2",
"typescript": "~3.5.3",
"vue-template-compiler": "^2.6.10"
},
"eslintConfig": {
"root": true,
"extends": [
"gitee",
"stylelint-config-prettier"
]
}
}
因为 它太大了无法显示 源差异 。您可以改为 查看blob
......@@ -99,6 +99,11 @@ import AppAlertGroup from './components/app-alert-group/app-alert-group.vue'
import AppRawItem from './components/app-rawitem/app-rawitem.vue'
import AppImageRomate from './components/app-image-romate/app-image-romate.vue'
import { MenuIcon } from './components/menu-icon/menu-icon'
import AppVuePivottable from './components/app-vue-pivottable/app-vue-pivottable.vue';
import AppMapPosition from './components/app-map-position/app-map-position.vue';
import AppSortBar from './components/app-sort-bar/app-sort-bar.vue';
import AppAfterTime from './components/app-after-time/app-after-time.vue';
import AppInputIp from './components/app-input-ip/app-input-ip.vue';
// 全局挂载UI实体服务注册中心
window['uiServiceRegister'] = uiServiceRegister;
......@@ -213,5 +218,10 @@ export const AppComponents = {
v.component('app-rawitem',AppRawItem);
v.component('app-image-romate', AppImageRomate);
v.component('menu-icon', MenuIcon);
v.component('app-vue-pivottable', AppVuePivottable);
v.component('app-map-position', AppMapPosition);
v.component('app-sort-bar', AppSortBar);
v.component('app-after-time', AppAfterTime);
v.component('app-input-ip', AppInputIp);
},
};
\ No newline at end of file
......@@ -69,6 +69,30 @@ export default class CodeListService {
return (window as any)['codeListRegister'].getService(name);
}
/**
* 获取代码表数据
*
* @param {string} tag 代码表标识
* @param {*} context
* @param {*} data
* @param {boolean} isloading
* @returns {Promise<any[]>}
* @memberof CodeListService
*/
public async getDataItems(codelist:any,context?:any, data?: any, isloading?: boolean){
let dataItems:Array<any> = [];
try{
if(codelist.tag && Object.is(codelist.type,"STATIC")){
dataItems = await this.getStaticItems(codelist.tag);
}else{
dataItems = await this.getItems(codelist.tag,codelist.context,codelist.viewparam,codelist.isloading);
}
}catch(error){
console.warn("代码表加载异常" + error);
}
return dataItems;
}
/**
* 获取静态代码表
*
......
<template>
<div class="app-after-time">
<span v-if="diffTime =='minutes'">{{curvalue}}{{$t('components.appAfterTime.minutesAgo')}}</span>
<span v-if="diffTime =='hours'">{{curvalue}}{{$t('components.appAfterTime.hoursAgo')}}</span>
<span v-if="diffTime =='days'">{{curvalue}}{{$t('components.appAfterTime.dayAgo')}}</span>
<span v-if="diffTime =='mouth'">{{curvalue}}{{$t('components.appAfterTime.monthsAgo')}}</span>
<span v-if="diffTime =='years'">{{curvalue}}{{$t('components.appAfterTime.yearsAgo')}}</span>
<span v-if="!diffTime">&nbsp;</span>
</div>
</template>
<script lang="ts">
import { Vue, Component, Prop, Emit, Watch, Model } from 'vue-property-decorator';
import { Subject, Subscription } from 'rxjs';
@Component({})
export default class AppAfterTime extends Vue {
/**
* 属性项名称
*
* @type {string}
* @memberof AppAfterTime
*/
@Prop() public name!: string;
/**
* 应用上下文
*
* @type {any}
* @memberof AppAfterTime
*/
@Prop() context: any;
/**
* 视图参数
*
* @type {any}
* @memberof AppAfterTime
*/
@Prop() viewparam: any;
/**
* 表单状态对象
*
* @type {Subject<any>}
* @memberof AppAfterTime
*/
@Prop() public formState?:Subject<any>;
/**
* 表单绑定数据
*
* @type {any}
* @memberof AppAfterTime
*/
@Model('change') public value:any;
/**
* 当前值
*
* @type {any}
* @memberof AppAfterTime
*/
public curvalue: string = '';
/**
* 毫秒差
*
* @type {any}
* @memberof AppAfterTime
*/
public diffTime:any='';
/**
* 值变化
*
* @param {*} newVal
* @param {*} oldVal
* @memberof AppAfterTime
*/
@Watch('value')
public onValueChange(newVal: any, oldVal: any) {
this.transTime();
}
/**
* Vue声明周期(处理组件的输入属性)
*
* @memberof AppAfterTime
*/
public created(){
if(this.formState){
this.formState.subscribe(({type,data})=>{
if(Object.is('load',type)){
this.transTime();
}
})
}
this.transTime();
}
/**
* 处理时间
*
* @memberof AppAfterTime
*/
public transTime(){
if(this.value){
let oldTime = new Date(this.value).getTime();
let nowTime = new Date().getTime();
let diffTime = nowTime - oldTime;
if(diffTime < 3600000){
this.curvalue = Math.ceil(diffTime/60000)+'';
this.diffTime = 'minutes';
}else if(diffTime < 86400000){
this.curvalue = Math.ceil(diffTime/3600000)+'';
this.diffTime = 'hours';
}else if(diffTime < 2592000000){
this.curvalue = Math.floor(diffTime/86400000)+'';
this.diffTime = 'days';
}else if(diffTime < 31104000000){
this.curvalue = Math.floor(diffTime/2592000000)+'';
this.diffTime = 'mounth';
}else{
this.curvalue = Math.floor(diffTime/31104000000)+'';
this.diffTime = 'years';
}
}
}
}
</script>
<style>
.app-after-time{
margin-left: 6px;
}
</style>
\ No newline at end of file
......@@ -110,4 +110,11 @@ export default class AppAlertGroup extends Vue {
});
}
}
</script>
\ No newline at end of file
</script>
<style lang="less">
.view-body-messages {
margin-top: -10px;
margin-bottom: 6px;
}
</style>
\ No newline at end of file
<template>
<div class='form-druipart'>
<component
ref="appFormDruipart"
:is="viewname"
class="viewcontainer2"
:viewdata ="viewdata"
......@@ -178,6 +179,14 @@ export default class AppFormDRUIPart extends Vue {
*/
private formStateEvent: Unsubscribable | undefined;
/**
* 定时器实例
*
* @type {[any]}
* @memberof AppFormDRUIPart
*/
protected timer?: any;
/**
* 监控值
*
......@@ -308,11 +317,43 @@ export default class AppFormDRUIPart extends Vue {
}
if(!this.isForbidLoad){
setTimeout(() => {
this.formDruipart.next({action:'load',data:{srfparentdename:this.parentName,srfparentkey:_paramitem}});
this.partViewEvent('load',{data:{srfparentdename:this.parentName,srfparentkey:_paramitem}},0);
}, 0);
}
}
/**
* 向关系视图发送事件,采用轮询模式。避免异步视图出现加载慢情况
*
* @param {*} action 触发行为
* @param {*} data 数据
* @param {*} count 轮询计数
* @memberof AppFormDRUIPart
*/
protected partViewEvent(action: string, data: any, count: number = 0): void {
if (count > 100) {
return;
}
const clearResource:Function = () =>{
if(this.timer !== undefined){
clearTimeout(this.timer);
this.timer = undefined;
}
}
if (count === 0) {
clearResource();
}
if (this.$refs.appFormDruipart) {
this.formDruipart.next({ action: action, data });
clearResource();
return;
}
this.timer = setTimeout(() => {
count++;
this.partViewEvent(action, data, count);
}, 30);
}
/**
* vue 生命周期
*
......
......@@ -10,7 +10,9 @@
}
.app-form-item-label {
padding: 6px 10px 6px 0px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
}
......
......@@ -31,7 +31,17 @@
:class="labelclasses"
>
<span v-if="required" style="color:red;">* </span>
{{this.isEmptyCaption ? '' : this.caption}}
<span v-if="!isEmptyCaption">
<el-tooltip v-if="isShowTip" placement="top" effect="light">
<span v-html="caption"></span>
<template >
<span slot="content" v-html="caption" ></span>
</template>
</el-tooltip>
<template v-if="!isShowTip">
<span v-html="caption" ></span>
</template>
</span>
</span>
<div
v-if="Object.is(this.labelPos,'TOP') || Object.is(this.labelPos,'LEFT') || Object.is(this.labelPos,'RIGHT')"
......@@ -136,6 +146,14 @@ export default class AppFormItem extends Vue {
*/
@Prop() public itemRules!: any;
/**
* 是否显示表单项Label提示
*
* @memberof AppFormItem
*/
public isShowTip:boolean = false;
/**
* 值规则数组
*
......@@ -266,7 +284,21 @@ export default class AppFormItem extends Vue {
});
} catch (error) {}
}
this.getShowTip();
}
/**
* 计算是否显示表单项Label提示
*
* @memberof AppFormItem
*/
public getShowTip(){
if(this.caption && ((this.caption.length)*14) > this.labelWidth ){
this.isShowTip = true;
}
}
}
</script>
<style lang='less'>
......
input{
border-radius: 4px;
border:1px solid #888;
padding: 2px 10px;
width: 20%;
}
<template>
<div class="app-inpu-ip">
<input
type="text"
v-model="firstIp"
maxlength="3" />.
<input
type="text"
v-model="secIp"
maxlength="3" />.
<input
type="text"
maxlength="3"
v-model="thirdIp" />.
<input
type="text"
maxlength="3"
v-model="forIp" />
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from 'vue-property-decorator';
import { Subject,Subscription } from 'rxjs';
import { debounceTime, distinctUntilChanged } from 'rxjs/operators';
@Component({
})
export default class AppInputIp extends Vue {
/**
* 应用上下文
*
* @type {any}
* @memberof AppInputIp
*/
@Prop() context: any;
/**
* 视图参数
*
* @type {any}
* @memberof AppInputIp
*/
@Prop() viewparam: any;
/**
* 表单状态对象
*
* @type {Subject<any>}
* @memberof AppInputIp
*/
@Prop() public formState!: Subject<any>;
/**表单数据绑定
*
* @type {string}
* @memberof AppInputIp
*/
@Model('change') public ipdata!: string;
/**
* 获取当前值
*
* @type {string}
* @memberof AppInputIp
*/
public CurValue: any[] = [];
/**
* 第一段ip
*
* @type {any}
* @memberof AppInputIp
*/
public firstIp: any = '';
/**
* 第二段ip
*
* @type {any}
* @memberof AppInputIp
*/
public secIp: any = '';
/**
* 第三段ip
*
* @type {any}
*/
public thirdIp: any = '';
/**
* 第四段ip
*
* @type {any}
* @memberof AppInputIp
*/
public forIp: any = '';
/**
* Vue声明周期(处理组件的输入属性)
*
* @memberof AppInputIp
*/
public created(){
if(this.formState){
this.formState.subscribe(({type,data})=>{
if(Object.is('load',type)){
this.loadData();
}
})
}
this.loadData();
}
/**
* 加载数据
*
* @memberof AppInputIp
*/
public loadData(){
if(this.ipdata){
let iparr:Array<any> = this.ipdata.split('.');
this.CurValue = iparr;
this.firstIp = this.CurValue[0];
this.secIp = this.CurValue[1];
this.thirdIp = this.CurValue[2];
this.forIp = this.CurValue[3];
}
}
/**
* 监听每段ip变化
*
* @memberof AppInputIp
*/
@Watch('firstIp')
public FirstIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'firstIp',0);
}
@Watch('secIp')
public SecIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'secIp',1);
}
@Watch('thirdIp')
public ThirdIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'thirdIp',2);
}
@Watch('forIp')
public ForIpChange(newVal:any,oldVal:any){
this.checkIpVal(newVal,oldVal,'forIp',3);
}
/**
* 验证格式
*
* @memberof AppInputIp
*/
public checkIpVal(newVal:any,oldVal:any,flag:any,index:number){
if(newVal === '') return
let val = newVal;
let reg = /^(([0-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))))$/g;
if(reg.test(val)){
this.CurValue[index] = val;
}else{
if(flag){
let that:any = this;
that[flag] = oldVal;
this.CurValue[index] = oldVal;
}
}
if(this.firstIp && this.secIp && this.thirdIp && this.forIp){
this.$emit('change',this.firstIp+'.'+this.secIp+'.'+this.thirdIp+'.'+this.forIp);
}
}
}
</script>
<style lang='less'>
@import './app-input-ip.less';
</style>
.app-map-position {
.map-modal {
.el-dialog {
margin-top: 60px !important;
width: 90%;
.el-dialog__header {
padding: 10px 0px 10px 40px;
}
.el-dialog__body {
padding: 6px 10px;
.search-toolbar {
display: flex;
#map__result {
position: absolute;
z-index: 20;
right: 10px;
top: 110px;
}
.el-vue-search-box-container {
border: 1px solid #DCDFE6;
height: 40px;
margin-right: 20px;
}
}
}
.amap-marker-content {
img {
width: 25px;
height: 34px;
}
.input-map__marker {
position: absolute;
top: -28px;
right: -160px;
color: #fff;
padding: 0px 10px;
-webkit-box-shadow: 1px 1px 1px rgba(10,10,10,.2);
box-shadow: 1px 1px 1px rgba(10,10,10,.2);
white-space: nowrap;
font-size: 12px;
font-family: "";
background-color: #25a5f7;
border-radius: 3px;
}
}
}
.el-vue-amap-container {
padding-top: 20px;
height: 640px;
}
}
}
\ No newline at end of file
<template>
<div class="app-map-position">
<el-input
size="small"
@focus="handleMapShow"
v-model="value"
:placeholder="placeholder ? placeholder : $t('components.appMapPosition.title')">
</el-input>
<el-dialog
:title="$t('components.appMapPosition.title')"
class="map-modal"
:visible.sync="dialogShow">
<div class="search-toolbar">
<el-input id="map__search" size="small" @change="handleSearch" v-model="searchAddress" />
<div id="map__result" class="content-result" v-show="resultShow"></div>
</div>
<div class="map__content">
<el-amap
:center="center"
:amap-manager="amapManager"
zoom="12"
:events="events"
ref="map">
<el-amap-marker
class="map-marker"
vid="component-marker"
:position="marker.position">
<div>
<img src="//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png">
<span class="input-map__marker">{{ marker.address }}</span>
</div>
</el-amap-marker>
</el-amap>
</div>
<template slot="footer">
<el-button
type="primary"
size="small"
@click="handleSubmit">
{{ $t('components.appMapPosition.submit') }}
</el-button>
</template>
</el-dialog>
</div>
</template>
<script lang='tsx'>
import { Vue, Component, Prop, Watch, Model } from 'vue-property-decorator';
import { Subject, Subscription } from 'rxjs';
import { AMapManager } from 'vue-amap';
@Component({})
export default class AppMapPosition extends Vue {
/**
* 双向绑定表单项值
*
* @type {*}
* @memberof AppMapPosition
*/
@Model('change') public value: any;
/**
* 占位内容
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop() public placeholder?: string;
/**
* 经度
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop() public longitude?: any;
/**
* 纬度
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop() public latitude?: any;
/**
* 地址
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop() public address?: any;
/**
* 模式(address、longitude、latitude)
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop({default: 'address'}) public mode: any;
/**
* 表单数据
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop() public data: any;
/**
* 表单通讯对象
*
* @type {*}
* @memberof AppMapPosition
*/
@Prop() public formState!: Subject<any>;;
/**
* 搜索框显示值
*
* @type {*}
* @memberof AppMapPosition
*/
public searchAddress: string = '';
/**
* AMap SDK对象
*
* @type {*}
* @memberof AppMapPosition
*/
public amapManager: any = new AMapManager();
/**
* 地图中心点
*
* @type {*}
* @memberof AppMapPosition
*/
public center: any[] = [104.09427199999999, 30.660396];
/**
* 地图模态框显示状态
*
* @type {*}
* @memberof AppMapPosition
*/
public dialogShow: boolean = false;
/**
* 地图标点信息
*
* @type {*}
* @memberof AppMapPosition
*/
public marker: any = {};
/**
* 初始化地图标点
*
* @type {*}
* @memberof AppMapPosition
*/
public markerResult: any = {};
/**
* 事件集合
*
* @type {*}
* @memberof AppMapPosition
*/
public events: any = {};
/**
* 获取地址需求AMap插件对象
*
* @type {*}
* @memberof AppMapPosition
*/
public geocoder: any;
/**
* 当前 window
*
* @type {*}
* @memberof AppMapPosition
*/
public win: any;
/**
* 搜索结果显示框状态
*
* @type {*}
* @memberof AppMapPosition
*/
public resultShow: boolean = false;
/**
* Vue生命周期
*
* @memberof AppMapPosition
*/
public created() {
this.win = window as any;
if(this.formState) {
this.formState.subscribe(({ type, data }) => {
if(Object.is('load', type)) {
this.initMap();
}
})
}
}
/**
* Vue生命周期
*
* @memberof AppMapPosition
*/
public mounted() {
let amap: any = this.win.AMap;
amap.plugin(["AMap.Geocoder"], () => {
this.geocoder = new amap.Geocoder({
extensions: "all",
})
})
this.initMapEvents();
}
/**
* 根据当前模式初始化地图
*
* @memberof AppMapPosition
*/
public initMap() {
if(!this.mode || !this.value) {
return;
}
if(Object.is(this.mode, 'address')) {
this.initByAddress()
} else if(Object.is(this.mode, 'longitude')) {
this.initByLng();
} else if(Object.is(this.mode, 'latitude')) {
this.initByLat();
}
}
/**
* mode = address,初始化地图
*
* @memberof AppMapPosition
*/
public initByAddress() {
if(this.longitude && this.latitude && this.data) {
const position = [this.data[this.longitude], this.data[this.latitude]];
Object.assign(this.marker, {
position: position,
address: this.value,
visible: true
});
this.center = position;
this.searchAddress = this.marker.address;
Object.assign(this.markerResult, this.marker);
} else {
Object.assign(this.marker, {
position: [104.09427199999999, 30.660396],
address: '四川省成都市成华区猛追湾街道四川电视塔天府熊猫塔',
visible: true
})
this.searchAddress = this.marker.address;
}
}
/**
* mode = longitude,初始化地图
*
* @memberof AppMapPosition
*/
public initByLng() {
if(this.latitude && this.data) {
this.handleMarker(this.value, this.data[this.latitude], this);
} else {
Object.assign(this.marker, {
position: [104.09427199999999, 30.660396],
address: '四川省成都市成华区猛追湾街道四川电视塔天府熊猫塔',
visible: true
})
this.searchAddress = this.marker.address;
}
}
/**
* mode = latitude,初始化地图
*
* @memberof AppMapPosition
*/
public initByLat() {
if(this.longitude && this.data) {
this.handleMarker(this.data[this.longitude], this.value, this);
} else {
Object.assign(this.marker, {
position: [104.09427199999999, 30.660396],
address: '四川省成都市成华区猛追湾街道四川电视塔天府熊猫塔',
visible: true
})
this.searchAddress = this.marker.address;
}
}
/**
* 初始化地图事件
*
* @memberof AppMapPosition
*/
public initMapEvents() {
const that: any = this;
that.events = {
click($event: any) {
that.mapClick($event);
},
init($event: any) {
that.map = $event;
}
};
}
/**
* 展开模态框
*
* @memberof AppMapPosition
*/
public handleMapShow() {
this.resultShow = false;
this.dialogShow = true;
this.searchAddress = this.markerResult.address;
Object.assign(this.marker, this.markerResult);
this.center = this.markerResult.position;
}
/**
* 处理地图标点
*
* @param {*} lng 经度
* @param {*} lat 纬度
* @param {*} that this指针
* @param {boolean} flag 是否更新结果集
* @memberof AppMapPosition
*/
public async handleMarker(lng: any, lat: any, that: any, flag: boolean = true) {
const address = await this.getAddress(lng, lat).catch((error) => {
console.warn(error);
});
if(!address) {
return;
}
Object.assign(that.marker, { position: [lng, lat], address: address, visible: true });
that.searchAddress = address;
that.center = [lng, lat];
if(flag) {
Object.assign(this.markerResult, this.marker);
}
}
/**
* 搜索地址
*
* @memberof AppMapPosition
*/
public handleSearch() {
this.center = [];
const that = this;
let placeSearch: any;
// 调用服务搜索结果
that.win.AMap.service(["AMap.PlaceSearch"], () => {
placeSearch = new this.win.AMap.PlaceSearch({
pageSize: 5,
city: '成都',
citylimit: false,
panel: 'map__result',
})
placeSearch.search(that.searchAddress, (status: any, result: any) => {
if (status == 'complete' && result.info == 'OK') {
this.resultShow = true;
if(result.poiList.pois) {
that.handleMarker(result.poiList.pois[0].location.R, result.poiList.pois[0].location.Q, that, false);
}
}
})
})
// 监听搜索结果列表点击事件
that.win.AMap.event.addListener(placeSearch,"listElementClick", (e: any) => {
if(e.data.location) {
that.handleMarker(e.data.location.R, e.data.location.Q, that, false);
}
})
}
/**
* 地图点击事件
*
* @memberof AppMapPosition
*/
public mapClick($event: any) {
if(!$event && !$event.lnglat) {
return;
}
const that = this;
that.handleMarker($event.lnglat.lng, $event.lnglat.lat, that, false);
}
/**
* 调用服务,根据经纬度获取地址信息
*
* @param {*} lng 经度
* @param {*} lat 纬度
* @memberof AppMapPosition
*/
public getAddress(lng: any, lat: any) {
return new Promise((resolve, reject) => {
this.geocoder.getAddress([lng,lat],(status:any,result: any) => {
if (status === 'complete' && result.info === 'OK') {
if (result && result.regeocode) {
const address = result.regeocode.formattedAddress;
resolve(address);
}
}
})
})
}
/**
* 点击模态确认按钮,提交数据
*
* @memberof AppMapPosition
*/
public handleSubmit() {
this.dialogShow = false;
Object.assign(this.markerResult, this.marker);
if(!this.markerResult || !this.mode) {
return;
}
if(Object.is(this.mode, 'address')) {
this.$emit('change', this.markerResult.address);
const lng = { name: this.longitude, value: this.markerResult.position[0].toString() };
const lat = { name: this.latitude, value: this.markerResult.position[1].toString() };
this.$emit('itemChange', lng, lat);
} else if(Object.is(this.mode, 'longitude')) {
this.$emit('change', this.markerResult.position[0]);
const address = { name: this.address, value: this.markerResult.address };
const lat = { name: this.latitude, value: this.markerResult.position[1].toString() };
this.$emit('itemChange', address, lat);
} else if(Object.is(this.mode, 'latitude')) {
this.$emit('change', this.markerResult.position[1]);
const address = { name: this.address, value: this.markerResult.address };
const lng = { name: this.longitude, value: this.markerResult.position[0].toString() };
this.$emit('itemChange', address, lng);
}
}
}
</script>
<style lang='less'>
@import './app-map-position.less';
</style>
\ No newline at end of file
<template>
<div>
<el-rate
:value ="currentVal"
:disabled="disabled"
:max="max"
@change="change"
>
</el-rate>
</div>
<div>
<el-rate :value="currentVal" :disabled="disabled" :max="maxItem" @change="change"> </el-rate>
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
<script lang="ts">
import { Component, Vue, Prop, Model, Watch } from 'vue-property-decorator';
import CodeListService from '@codelist/codelist-service';
@Component({})
export default class AppRate extends Vue {
/**
* 传入值
* @type {any}
* @memberof AppRate
*/
@Prop() public value?:any;
/**
* 是否禁用
* @type {boolean}
* @memberof AppRate
*/
@Prop() public disabled?: boolean;
/**
* 最大值
* @type {number}
* @memberof AppRate
*/
@Prop({default:5}) public max!: number;
/**
* 当前值
*
* @memberof AppRate
*/
get currentVal() {
return this.value;
}
/**
* change
*/
public change(val: any) {
this.$emit("change", val);
}
/**
* 传入值
* @type {any}
* @memberof AppRate
*/
@Prop() public value?: any;
/**
* 是否禁用
* @type {boolean}
* @memberof AppRate
*/
@Prop() public disabled?: boolean;
/**
* 下发数据
* @type {number}
* @memberof AppRate
*/
@Prop() public data?: any;
/**
* 代码表服务对象
*
* @type {CodeListService}
* @memberof AppRate
*/
public codeListService: CodeListService = new CodeListService({ $store: this.$store });
/**
* 传递最大值
* @type {*}
* @memberof AppRate
*/
@Prop({ default: 5 }) public max!: number;
/**
* 应用上下文
* @type {*}
* @memberof AppRate
*/
@Prop() context: any;
/**
* 视图参数
* @type {*}
* @memberof AppRate
*/
@Prop() viewparams: any;
/**
* 临时上下文
* @type {*}
* @memberof AppRate
*/
@Prop() localContext: any;
/**
* 临时参数
* @type {*}
* @memberof AppRate
*/
@Prop() localParam: any;
/**
* 代码表标识
* @type {string}
* @memberof AppRate
*/
@Prop() tag?: string;
/**
* 代码表类型
* @type {string}
* @memberof AppRate
*/
@Prop() codelistType?: string;
/**
* 代码表值分隔符
* @type {string}
* @memberof AppRate
*/
@Prop({default: ','}) valueSeparator?: string;
/**
* 数据名称
* @type {*}
* @memberof AppRate
*/
@Prop() name: any;
/**
* 最大值
* @type {number}
* @memberof AppRate
*/
public maxItem: number = 5;
/**
* 监听数据变化
*
* @memberof AppRate
*/
@Watch('data',{immediate:true,deep:true})
onDataChange(newVal: any, oldVal: any) {
if(newVal){
if(this.tag && this.codelistType == 'DYNAMIC'){
// 公共参数处理
let data: any = {};
this.handlePublicParams(data);
// 参数处理
let _context = data.context;
let _param = data.param;
this.codeListService.getItems(this.tag, _context, _param).then((res: any) => {
const items = res;
// 获取最大值
const maxItem = Math.max.apply(Math,items.map((item: any) => { return item.value; }));
this.maxItem = maxItem>5 ? 5 : maxItem;
}).catch((error: any) => {
console.log(`----${this.tag}----$t('components.appCheckBox.notExist')`);
});
}
}
}
/**
* 当前值
*
* @memberof AppRate
*/
get currentVal() {
return Number(this.value);
}
/**
* change
*/
public change(val: any) {
this.$emit('change', val);
}
/**
* Vue生命周期
* @memberof AppRate
*/
public created() {
if (this.max) {
this.maxItem = this.max;
}
this.handleCodelist();
}
/**
* 公共参数处理
*
* @param {*} arg
* @returns
* @memberof AppRate
*/
public handlePublicParams(arg: any) {
// 合并表单参数
arg.param = this.viewparams ? JSON.parse(JSON.stringify(this.viewparams)) : {};
arg.context = this.context ? JSON.parse(JSON.stringify(this.context)) : {};
// 附加参数处理
if (this.localContext && Object.keys(this.localContext).length >0) {
let _context = this.$util.computedNavData(this.data,arg.context,arg.param,this.localContext);
Object.assign(arg.context,_context);
}
if (this.localParam && Object.keys(this.localParam).length >0) {
let _param = this.$util.computedNavData(this.data,arg.param,arg.param,this.localParam);
Object.assign(arg.param,_param);
}
}
/**
* 根据代码表获取最大值
* @memberof AppRate
*/
public handleCodelist() {
if (this.tag && Object.is(this.codelistType, 'STATIC')) {
const codelist = this.$store.getters.getCodeList(this.tag);
if (codelist) {
const items = [...JSON.parse(JSON.stringify(codelist.items))];
// 获取最大值
const maxItem = Math.max.apply(Math,items.map((item: any) => { return item.value; }));
this.maxItem = maxItem>5 ? 5 : maxItem;
} else {
console.log(`----${this.tag}----$t('components.appCheckBox.notExist')`);
}
} else if (this.tag && Object.is(this.codelistType, 'DYNAMIC')) {
// 公共参数处理
let data: any = {};
this.handlePublicParams(data);
// 参数处理
let _context = data.context;
let _param = data.param;
this.codeListService.getItems(this.tag, _context, _param).then((res: any) => {
const items = res;
// 获取最大值
let maxItem = Math.max.apply(Math,items.map((item: any) => { return item.value; }));
this.maxItem = maxItem>5 ? 5 : maxItem;
}).catch((error: any) => {
console.log(`----${this.tag}----$t('components.appCheckBox.notExist')`);
});
}
}
}
</script>
<style lang='less'>
@import "./app-rate.less";
</style>
\ No newline at end of file
<style lang="less">
@import './app-rate.less';
</style>
.app-sort-bar{
padding: 6px 8px;
.ivu-row-flex.page-sort-bar{
width: 100%;
height: 30px;
position: relative;
.ivu-col{
border-radius: 2px;
user-select: none;
text-align: center;
margin: 0px 16px;
display: flex;
align-items: flex-end;
padding-bottom: 4px;
background-color: #FFF;
border: 1px solid #CCC;
margin-left: -1px;
.sort-field-text{
margin-left: 7px;
}
.caret-wrapper{
width: 15px;
display: inline-block;
position: relative;
top: 4px;
padding-bottom: 2px;
.ivu-icon{
display: block;
line-height: 0.5;
color: #c5c8ce;
}
}
}
// 悬浮样式
.ivu-col:hover{
border:1px solid #82bff7;
position:relative;
z-index:2;
.sort-field-text{
color: #82bff7;
}
}
// 选中样式
.sort-ascending, .sort-descending{
border:1px solid #82bff7;
position:relative;
z-index:2;
.sort-field-text{
color:#82bff7;
font-weight: 800;
}
}
.sort-ascending .caret-wrapper .ivu-icon.ivu-icon-md-arrow-dropup,
.sort-descending .caret-wrapper .ivu-icon.ivu-icon-md-arrow-dropdown{
color: #82bff7;
}
.issort {
position: absolute;
cursor: pointer;
top: 4px;
right: 10px;
}
}
}
.open-bar {
background-color: #EEF2F5;
}
\ No newline at end of file
<template>
<div :class="['app-sort-bar', isSort ? 'open-bar' : '']">
<row v-if="sortModel && sortModel.length>0" class="page-sort-bar" :gutter="10" type="flex" justify="start" style="margin:0px;">
<template v-for="(item, index) in sortModel">
<i-col v-show="isSort" :key="index" :class="getSortClass(item)">
<div @click="sortItemClick(item)">
<span class="sort-field-text" >{{$t('entities.'+ entityName +'.fields.' + item)}}</span>
<span class="caret-wrapper">
<Icon type="md-arrow-dropup" />
<Icon type="md-arrow-dropdown" />
</span>
</div>
</i-col>
</template>
<div class="issort" @click="handleSort">
<Icon v-if="isSort" type="ios-funnel-outline" />
<Icon v-else type="ios-funnel" />
{{ $t('components.appSortBar.title') }}
</div>
</row>
</div>
</template>
<script lang='ts'>
import { Component, Vue, Prop, Model, Watch } from "vue-property-decorator";
@Component({})
export default class AppSortBar extends Vue {
@Prop() public sortModel!: any[];
@Prop() public sortField!: any;
@Prop() public sortDir!: any;
@Prop() public entityName!: string;
public isSort: boolean = false;
public getSortClass(name: any) {
if(this.sortField !== name || this.sortDir === ''){
return '';
}else if(this.sortDir === 'asc'){
return 'sort-ascending'
}else if(this.sortDir === 'desc'){
return 'sort-descending'
}
}
public sortItemClick(name: string) {
console.log(name);
this.$emit('clickSort', name);
}
public handleSort() {
this.isSort = !this.isSort;
}
}
</script>
<style lang="less">
@import './app-sort-bar.less';
</style>
\ No newline at end of file
<template>
<vue-pivottable-ui
class="app-vue-pivottable"
:data="datas"
:aggregatorName="aggregatorName"
:rendererName="rendererName"
:columns="columns"
:rows="rows"
:cols="cols"
:vals="vals"
:locales="locales"
:rowTotal="rowTotal"
:colTotal="colTotal"
:onChange="onChange"
:hiddenFromDragDrop="hiddenFromDragDrop"
>
</vue-pivottable-ui>
</template>
<script lang = 'ts'>
import { Vue, Component, Prop } from 'vue-property-decorator';
import { VuePivottableUi } from 'ibiz-vue-pivottable';
import 'ibiz-vue-pivottable/dist/vue-pivottable.css';
@Component({
components: {
VuePivottableUi
}
})
export default class AppVuePivotTable extends Vue {
/**
* 数据集
*
* @type {*}
* @memberof AppVuePivotTable
*/
@Prop() datas: any;
/**
* 列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
@Prop() allColumns: any;
/**
* 聚合模式
*
* @type {string}
* @memberof AppVuePivotTable
*/
protected aggregatorName: string = 'Sum';
/**
* 渲染模式
*
* @type {string}
* @memberof AppVuePivotTable
*/
protected rendererName: string = 'Table Heatmap';
/**
* 行统计
*
* @type {boolean}
* @memberof AppVuePivotTable
*/
protected rowTotal: boolean = true;
/**
* 列统计
*
* @type {boolean}
* @memberof AppVuePivotTable
*/
protected colTotal: boolean = true;
/**
* 列属性列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected cols: any[] = [];
/**
* 行属性列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected rows: any[] = [];
/**
* 值属性集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected vals: any[] = [];
/**
* 隐藏列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected hiddenFromDragDrop: any[] = [];
/**
* 展现列集合
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected columns: any[] = [];
/**
* 语言资源
*
* @type {*}
* @memberof AppVuePivotTable
*/
protected locales: any = {
aggregators: {
'Count': 'Count',
'Count Unique Values': 'Count Unique Values',
'List Unique Values': 'List Unique Values',
'Sum': 'Sum',
'Integer Sum': 'Integer Sum',
'Average': 'Average',
'Median': 'Median',
'Sample Variance': 'Sample Variance',
'Sample Standard Deviation': 'Sample Standard Deviation',
'Minimum': 'Minimum',
'Maximum': 'Maximum',
'First': 'First',
'Last': 'Last',
'Sum over Sum': 'Sum over Sum',
'Sum as Fraction of Total': 'Sum as Fraction of Total',
'Sum as Fraction of Rows': 'Sum as Fraction of Rows',
'Sum as Fraction of Columns': 'Sum as Fraction of Columns',
'Count as Fraction of Total': 'Count as Fraction of Total',
'Count as Fraction of Rows': 'Count as Fraction of Rows',
'Count as Fraction of Columns': 'Count as Fraction of Columns'
},
renderer: {
'Table': 'Table',
'Table Heatmap': 'Table Heatmap',
'Table Col Heatmap': 'Table Col Heatmap',
'Table Row Heatmap': 'Table Row Heatmap',
'Expor Table TSV': 'Expor Table TSV',
'Grouped Column Chart': 'Grouped Column Chart',
'Stacked Column Chart': 'Stacked Column Chart',
'Grouped Bar Chart': 'Grouped Bar Chart',
'Stacked Bar Chart': 'Stacked Bar Chart',
'Line Chart': 'Line Chart',
'Dot Chart': 'Dot Chart',
'Area Chart': 'Area Chart',
'Scatter Chart': 'Scatter Chart',
'Multiple Pie Chart': 'Multiple Pie Chart'
},
'Filter Values': 'Filter Values',
'Select All': 'Select All',
'Deselect All': 'Deselect All',
'Totals': 'Totals'
};
/**
* 生命周期
*
* @type {*}
* @memberof AppVuePivotTable
*/
public created() {
if(this.allColumns) {
this.allColumns.forEach((item: any) => {
if(!item.show) {
this.hiddenFromDragDrop.push(item.name);
}
let col: any = { ...item };
col.prop = col.name;
this.columns.push(col);
});
}
}
/**
* 事件
*
* @type {*}
* @memberof AppVuePivotTable
*/
public onChange(evt: any) {
console.log(evt);
}
}
</script>
<style lang="less">
.app-vue-pivottable {
height: calc(100% - 1px);
.pvtTable {
min-width: 100%;
}
}
</style>
\ No newline at end of file
......@@ -3,9 +3,14 @@
<span v-if="ifEmpty">{{$t('codelist.'+tag+'.empty')}}</span>
<template v-if="!ifEmpty">
<template v-for="(item, index) in items">
<span>{{ index != 0 ? textSeparator : ''}}</span>
<i v-if="item.iconCls" :class="item.iconCls"></i>
<span :class="item.textCls" :style="{color:item.color}">{{isUseLangres ? $t(item.text) : item.text}}</span>
<div class="codelist-item" :key="index">
<i v-if="item.iconcls" :class="item.iconcls"></i>
<img v-if="item.icon" :src="getIcon(item.icon)" />
<span :class="item.class" :style="{ color: item.color }">
{{ isUseLangres ? $t(item.text) : item.text }}
</span>
<span v-if="index != items.length-1">{{ textSeparator }}</span>
</div>
</template>
</template>
</div>
......@@ -14,6 +19,7 @@
<script lang="ts">
import { Vue, Component, Prop, Model, Watch } from 'vue-property-decorator';
import CodeListService from "@/codelist/codelist-service";
import { Environment } from '@/environments/environment';
@Component({})
export default class CodeList extends Vue {
......@@ -288,14 +294,66 @@ export default class CodeList extends Vue {
}
}
/**
* 获取图片路径
*
* @param {*} arg
* @returns
* @memberof CodeList
*/
public getIcon(arg:any){
if(!arg){
return;
}
if(Object.prototype.toString.call(arg)=="[object String]"){
try {
let targetData:any = JSON.parse(arg);
if(Object.prototype.toString.call(targetData) == "[object Array]"){
if(targetData && targetData.length >0){
let fileId:string = targetData[0] && targetData[0].id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}
}else if(Object.prototype.toString.call(targetData) === '[object Object]'){
let fileId:string = targetData && targetData.id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}
} catch (error) {
return arg;
}
}else if(Object.prototype.toString.call(arg) == "[object Array]"){
if(arg && arg.length >0){
let fileId:string = arg[0] && arg[0].id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}
}else if(Object.prototype.toString.call(arg) === '[object Object]'){
let fileId:string = arg && arg.id;
return Environment.BaseUrl + Environment.ExportFile + fileId;
}else{
return arg;
}
}
}
</script>
<style lang='less'>
.codelist {
display: flex;
white-space: nowrap;
text-overflow: ellipsis;
word-break: break-all;
overflow: hidden;
.codelist-item{
display: flex;
align-items: center;
max-height: 32px;
padding: 0px 3px;
> img{
max-height: 32px;
width: auto;
margin-right: 6px;
border-radius: 50%;
}
}
}
</style>
\ No newline at end of file
......@@ -265,9 +265,8 @@ export default class DropDownList extends Vue {
this.loadData();
}
});
}else{
this.loadData();
}
this.loadData();
}
/**
......
.menu-icon {
padding-right: 6px;
}
\ No newline at end of file
......@@ -29,10 +29,10 @@ export class MenuIcon extends Vue {
public render(): any {
if (this.item) {
if (this.item.iconcls) {
return <i class={this.item.iconcls} />
return <i class={[this.item.iconcls, 'menu-icon']} />
}
if (this.item.icon) {
return <img src={this.item.icon} />
return <img class="menu-icon" src={this.item.icon} />
}
}
return <span />
......
import MDViewEngine from './md-view-engine';
/**
* 视图引擎基础
*
* @export
* @class GridViewEngine
* @extends {MDViewEngine}
*/
export default class MapViewEngine extends MDViewEngine {
/**
* 表格部件
*
* @type {*}
* @memberof GridViewEngine
*/
protected map: any;
/**
* Creates an instance of GridViewEngine.
* @memberof MapViewEngine
*/
constructor() {
super();
}
/**
* 引擎初始化
*
* @param {*} [options={}]
* @memberof MapViewEngine
*/
public init(options: any = {}): void {
this.map = options.map;
super.init(options);
}
/**
* 引擎加载
*
* @param {*} [opts={}]
* @memberof MapViewEngine
*/
public load(opts: any = {},isnotify:boolean=false): void {
if(!this.view.isformDruipart){
super.load(opts, isnotify);
}else{
if(isnotify){
super.load(opts, isnotify);
}
}
}
/**
* 获取多数据部件
*
* @returns {*}
* @memberof MapViewEngine
*/
public getMDCtrl(): any {
return this.map;
}
}
\ No newline at end of file
import MapViewEngine from './map-view-engine';
/**
* 视图引擎基础
*
* @export
* @class GridViewEngine
* @extends {MDViewEngine}
*/
export default class MapView9Engine extends MapViewEngine {
}
\ No newline at end of file
......@@ -197,7 +197,13 @@ export default class ViewEngine {
if(_item && _item['dataaccaction'] && _this.view.appUIService){
let dataActionResult:any;
if (_item.uiaction && (Object.is(_item.uiaction.target, "NONE") || Object.is(_item.uiaction.target, ""))){
dataActionResult = _this.view.appUIService.getResourceOPPrivs(_item['dataaccaction']);
if(Object.is(_item.uiaction.target, "") && Object.is(_item.uiaction.tag, "Save")){
if(data && Object.keys(data).length >0){
dataActionResult= _this.view.appUIService.getAllOPPrivs(data)[_item['dataaccaction']];
}
}else{
dataActionResult = _this.view.appUIService.getResourceOPPrivs(_item['dataaccaction']);
}
}else{
if(data && Object.keys(data).length >0){
dataActionResult= _this.view.appUIService.getAllOPPrivs(data)[_item['dataaccaction']];
......
......@@ -18,13 +18,15 @@ export default class WFDynaEditViewEngine extends EditViewEngine {
}
/**
* 表单加载完成
* 引擎加载
*
* @param {*} args
* @param {*} [opts={}]
* @memberof WFDynaEditViewEngine
*/
public onFormLoad(arg: any): void {
super.onFormLoad(arg);
this.view.getWFLinkModel();
public load(opts: any = {}): void {
if(this.view.getWFLinkModel && this.view.getWFLinkModel instanceof Function){
this.view.getWFLinkModel();
}
}
}
\ No newline at end of file
......@@ -375,5 +375,19 @@ export default {
false: 'False',
deleteImageFailure:'Image deletion failed',
updateFailure: 'Batch update file failed',
}
},
appMapPosition: {
submit: 'Submit',
title: 'Please select address'
},
appSortBar: {
title: 'Sort'
},
appAfterTime:{
minutesAgo: 'minutes ago',
hoursAgo: 'hours ago',
dayAgo: 'days ago',
monthsAgo: 'months ago',
yearsAgo: 'years ago'
}
};
\ No newline at end of file
......@@ -376,5 +376,19 @@ export default {
false: '取消',
deleteImageFailure:'删除图片失败',
updateFailure: '批量更新文件失败',
}
},
appMapPosition: {
submit: '确认',
title: '请选择地址'
},
appSortBar: {
title: '排序'
},
appAfterTime:{
minutesAgo: '分钟前',
hoursAgo: '小时前',
dayAgo: '天前',
monthsAgo: '月前',
yearsAgo: '年前'
}
};
\ No newline at end of file
......@@ -9,7 +9,7 @@
</div>
<div class='content-container'>
<div style='margin-bottom: 6px;'>
<i-input v-show="!isExpandSearchForm" v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;' placeholder="名称" />
<i-input v-show="!isExpandSearchForm" v-model="query" search enter-button @on-search="onSearch($event)" class='quick-search-input' style='max-width: 400px;padding-left: 24px' placeholder="名称" />
<div class='pull-right'>
<div class='toolbar-container'>
<tooltip :transfer="true" :max-width="600">
......
......@@ -15,6 +15,15 @@ import 'view-design/dist/styles/iview.css';
import 'ibiz-vue-lib/lib/ibiz-vue-lib.css';
import '@/styles/default.less';
import VueAMap from 'vue-amap';
Vue.use(VueAMap);
VueAMap.initAMapApiLoader({
key: '6ab2751103aea67e817c90a5528181b5',
plugin: ["AMap.Geolocation","AMap.PlaceSearch","AMap.Geocoder", "AMap.Autocomplete"],
uiVersion: '1.1'
});
// 模拟数据
if (process.env.NODE_ENV === 'development') {
require('@/mock');
......
......@@ -184,4 +184,18 @@ export default class SDFileServiceBase extends EntityService {
let res:any = Http.getInstance().get(`/sdfiles/fetchdefault`,tempData,isloading);
return res;
}
/**
* searchDefault接口方法
*
* @param {*} [context={}]
* @param {*} [data={}]
* @param {boolean} [isloading]
* @returns {Promise<any>}
* @memberof SDFileServiceBase
*/
public async searchDefault(context: any = {},data: any = {}, isloading?: boolean): Promise<any> {
let tempData:any = JSON.parse(JSON.stringify(data));
return await Http.getInstance().post(`/sdfiles/searchdefault`,tempData,isloading);
}
}
\ No newline at end of file
......@@ -9,4 +9,6 @@ declare module '@fullcalendar/list';
declare module '@fullcalendar/interaction';
declare module 'vue-grid-layout';
declare module 'vue-print-nb';
declare module 'vuedraggable';
\ No newline at end of file
declare module 'vuedraggable';
declare module 'ibiz-vue-pivottable';
declare module 'vue-amap';
\ No newline at end of file
......@@ -97,7 +97,7 @@
border-color: rgb(221, 221, 221);
border-style: solid;
border-width: 0px 0px 1px;
margin: 0px 0px 11px;
margin: 0px 0px 6px;
padding: 6px 0px 2px;
> .header-container{
min-height: 42px;
......
......@@ -13,6 +13,6 @@
</noscript>
<div id="app"></div>
<script src="./environments/environment.js"></script>
<script src="../assets/js/avue.min.js"></script>
<script src="./assets/js/avue.min.js"></script>
</body>
</html>
......@@ -345,6 +345,14 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public formKeyItemName: string = '';
/**
* 是否自动加载
*
* @type {boolean}
* @memberof MainBase
*/
@Prop({default:false}) public isautoload?:boolean;
/**
* 界面UI服务对象
*
......@@ -724,34 +732,40 @@ export default class MainBase extends Vue implements ControlInterface {
startOp(true);
return falg;
}
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
try {
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(dataValue,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.data,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(dataValue,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(dataValue,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(dataValue,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
} catch(error) {
falg.infoMessage = item.ruleInfo;
startOp(false);
if(!falg.isPast) return falg;
}
// 分组
......@@ -766,7 +780,7 @@ export default class MainBase extends Vue implements ControlInterface {
if(!falg.hasOwnProperty("isPast")){
falg.isPast = true;
}
if(!this.data[name]){
if(!this.data[name] && this.data[name] != 0){
falg.isPast = true;
}
return falg;
......@@ -1444,6 +1458,9 @@ export default class MainBase extends Vue implements ControlInterface {
* @memberof MainBase
*/
public afterCreated(){
if(this.isautoload){
this.autoLoad({srfkey:this.context.documentcenter});
}
if (this.viewState) {
this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => {
if (!Object.is(tag, this.name)) {
......@@ -2258,6 +2275,17 @@ export default class MainBase extends Vue implements ControlInterface {
public updateDefault(){
}
/**
* 面板数据变化处理事件
* @param {any} item 当前列数据
* @param {any} $event 面板事件数据
*
* @memberof MainBase
*/
public onPanelDataChange(item:any,$event:any) {
Object.assign(item, $event, {rowDataState:'update'});
}
}
</script>
......
......@@ -6,6 +6,7 @@
}
.app-form {
overflow: auto;
padding: 6px;
> .ivu-row {
> .ivu-tabs {
height: 100%;
......
......@@ -814,6 +814,22 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public groupAppField:string ="";
/**
* 分组属性代码表标识
*
* @type {string}
* @memberof MainBase
*/
public groupAppFieldCodelistTag:string ="";
/**
* 分组属性代码表类型
*
* @type {string}
* @memberof MainBase
*/
public groupAppFieldCodelistType: string = "";
/**
* 分组模式
*
......@@ -822,6 +838,22 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public groupMode:string ="NONE";
/**
* 分组代码表标识
*
* @type {string}
* @memberof MainBase
*/
public codelistTag: string = "";
/**
* 分组代码表类型
*
* @type {string}
* @memberof MainBase
*/
public codelistType: string = "";
/**
* 获取界面行为权限状态
*
......@@ -1071,7 +1103,6 @@ export default class MainBase extends Vue implements ControlInterface {
this.$Notice.success({ title: '', desc: (this.$t('app.gridpage.delSuccess') as string) });
}
//删除items中已删除的项
console.log(this.items);
_datas.forEach((data: any) => {
this.items.some((item:any,index:number)=>{
if(Object.is(item.srfkey,data.srfkey)){
......@@ -1418,7 +1449,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public rowDBLClick($event: any): void {
// 分组行跳过
if($event && $event.children && $event.children.length >0){
if($event && $event.children){
return;
}
if (!$event || this.actualIsOpenEdit || Object.is(this.gridRowActiveMode,0)) {
......@@ -1444,7 +1475,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public arraySpanMethod({row, column, rowIndex, columnIndex} : any) {
let allColumns:Array<any> = ['fileid','filename','filepath','filesize','fileext','folder','ownertype','ownerid','createdate','updatedate'];
if(row && row.children && row.children.length>0) {
if(row && row.children) {
if(columnIndex == (this.isSingleSelect ? 0:1)) {
return [1, allColumns.length+1];
} else if(columnIndex > (this.isSingleSelect ? 0:1)) {
......@@ -1453,6 +1484,136 @@ export default class MainBase extends Vue implements ControlInterface {
}
}
/**
* 分组方法
*
* @memberof MainBase
*/
public group(){
if(Object.is(this.groupMode,"AUTO")){
this.drawGroup();
}else if(Object.is(this.groupMode,"CODELIST")){
this.drawCodelistGroup();
}
}
/**
* 获取表格分组相关代码表
*
* @param {string} codelistType 代码表类型
* @param {string} codelistTag 代码表标识
* @memberof MainBase
*/
public getGroupCodelist(codelistType: string,codelistTag:string){
let codelist: Array<any> = [];
// 动态代码表
if (Object.is(codelistType, "DYNAMIC")) {
this.codeListService.getItems(codelistTag).then((res: any)=>{
codelist = res;
}).catch((error: any) => {
});
// 静态代码表
} else if(Object.is(codelistType, "STATIC")){
codelist = this.$store.getters.getCodeListItems(codelistTag);
}
return codelist;
}
/**
* 根据分组代码表绘制分组列表
*
* @memberof MainBase
*/
public drawCodelistGroup(){
if(!this.isEnableGroup) return;
// 分组
let allGroup: Array<any> = [];
let allGroupField: Array<any> =[];
let groupTree:Array<any> = [];
allGroup = this.getGroupCodelist(this.codelistType,this.codelistTag);
allGroupField = this.getGroupCodelist(this.groupAppFieldCodelistType,this.groupAppFieldCodelistTag);
if(allGroup.length == 0){
console.warn("分组数据无效");
}
allGroup.forEach((group: any,i: number)=>{
let children:Array<any> = [];
this.items.forEach((item: any,j: number)=>{
if(allGroupField && allGroupField.length > 0){
const arr:Array<any> = allGroupField.filter((field:any)=>{return field.value == item[this.groupAppField]});
if(Object.is(group.label,arr[0].label)){
item.groupById = Number((i+1) * 100 + (j+1) * 1);
item.group = '';
children.push(item);
}
}else if(Object.is(group.label,item[this.groupAppField])){
item.groupById = Number((i+1) * 100 + (j+1) * 1);
item.group = '';
children.push(item);
}
});
const tree: any ={
groupById: Number((i+1)*100),
group: group.label,
fileid:'',
filename:'',
filepath:'',
filesize:'',
fileext:'',
folder:'',
ownertype:'',
ownerid:'',
createdate:'',
updatedate:'',
children: children
}
groupTree.push(tree);
});
let child:Array<any> = [];
this.items.forEach((item: any,index: number)=>{
let i: number = 0;
if(allGroupField && allGroupField.length > 0){
const arr:Array<any> = allGroupField.filter((field:any)=>{return field.value == item[this.groupAppField]});
i = allGroup.findIndex((group: any)=>Object.is(group.label,arr[0].label));
}else{
i = allGroup.findIndex((group: any)=>Object.is(group.label,item[this.groupAppField]));
}
if(i < 0){
item.groupById = Number((allGroup.length+1) * 100 + (index+1) * 1);
item.group = '';
child.push(item);
}
if(i < 0){
item.groupById = Number((allGroup.length+1) * 100 + (index+1) * 1);
item.group = '';
child.push(item);
}
})
const Tree: any = {
groupById: Number((allGroup.length+1)*100),
group: this.$t('app.gridpage.other'),
fileid:'',
filename:'',
filepath:'',
filesize:'',
fileext:'',
folder:'',
ownertype:'',
ownerid:'',
createdate:'',
updatedate:'',
children: child
}
if(child && child.length > 0){
groupTree.push(Tree);
}
this.items = groupTree;
if(this.actualIsOpenEdit) {
for(let i = 0; i < this.items.length; i++) {
this.gridItemsModel.push(this.getGridRowModel());
}
}
}
/**
* 绘制分组
*
......@@ -1462,9 +1623,16 @@ export default class MainBase extends Vue implements ControlInterface {
if(!this.isEnableGroup) return;
// 分组
let allGroup: Array<any> = [];
let allGroupField: Array<any> =[];
allGroupField = this.getGroupCodelist(this.groupAppFieldCodelistType,this.groupAppFieldCodelistTag);
this.items.forEach((item: any)=>{
if(item.hasOwnProperty(this.groupAppField)){
allGroup.push(item[this.groupAppField]);
if(allGroupField && allGroupField.length > 0){
const arr:Array<any> = allGroupField.filter((field:any)=>{return field.value == item[this.groupAppField]});
allGroup.push(arr[0].label);
}else{
allGroup.push(item[this.groupAppField]);
}
}
});
let groupTree:Array<any> = [];
......@@ -1476,15 +1644,22 @@ export default class MainBase extends Vue implements ControlInterface {
allGroup.forEach((group: any, groupIndex: number)=>{
let children:Array<any> = [];
this.items.forEach((item: any,itemIndex: number)=>{
if(Object.is(group,item[this.groupAppField])){
item.groupById = Number((groupIndex+1) * 10 + (itemIndex+1) * 1);
if(allGroupField && allGroupField.length > 0){
const arr:Array<any> = allGroupField.filter((field:any)=>{return field.value == item[this.groupAppField]});
if(Object.is(group,arr[0].label)){
item.groupById = Number((groupIndex+1) * 100 + (itemIndex+1) * 1);
item.group = '';
children.push(item);
}
}else if(Object.is(group,item[this.groupAppField])){
item.groupById = Number((groupIndex+1) * 100 + (itemIndex+1) * 1);
item.group = '';
children.push(item);
}
});
group = group ? group : this.$t('app.gridpage.other');
const tree: any ={
groupById: Number((groupIndex+1)*10),
groupById: Number((groupIndex+1)*100),
group: group,
fileid:'',
filename:'',
......@@ -1615,7 +1790,7 @@ export default class MainBase extends Vue implements ControlInterface {
let flag: boolean = true;
if(selection && selection.length === this.items.length) {
selection.forEach((element: any) => {
if(element.children && element.children.length > 0) {
if(element.children) {
this.toggleSelection(element.children, flag);
element.children.forEach((children: any) => {
this.selections.push(children);
......@@ -1649,7 +1824,7 @@ export default class MainBase extends Vue implements ControlInterface {
*/
public rowClick($event: any, ifAlways: boolean = false): void {
// 分组行跳过
if($event && $event.children && $event.children.length >0){
if($event && $event.children){
return;
}
if (!ifAlways && (!$event || this.actualIsOpenEdit)) {
......@@ -1890,7 +2065,7 @@ export default class MainBase extends Vue implements ControlInterface {
}
this.$emit('save', successItems);
this.refresh([]);
if(errorItems.length === 0 && successItems.length >0 && !this.isformDruipart){
if(errorItems.length === 0 && successItems.length > 0){
this.$Notice.success({ title: '', desc: (this.$t('app.commonWords.saveSuccess') as string) });
}else{
errorItems.forEach((item: any, index: number) => {
......@@ -2009,7 +2184,7 @@ export default class MainBase extends Vue implements ControlInterface {
public gridEditItemChange(row: any, property: string, value: any, rowIndex: number){
row.rowDataState = row.rowDataState ? row.rowDataState : "update" ;
if(Object.is(row.rowDataState,"update")){
if(!value && this.defaultUpdateItems.includes(property)){
if(this.defaultUpdateItems.includes(property)){
row.hasUpdated = true;
}
}
......@@ -2199,30 +2374,47 @@ export default class MainBase extends Vue implements ControlInterface {
falg.isPast = val;
}
}
rule[name].forEach((item:any) => {
for(let i=0; i < rule[name].length; i++) {
let item: any = rule[name][i];
if((value === null || value === undefined || value === "") && (item.type != 'GROUP')){
startOp(true);
return falg;
}
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(value,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.curEditRowData,item.isKeyCond));
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(value,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(value,item.regExCode,item.ruleInfo,item.isKeyCond));
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(value,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(value,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
try {
// 常规规则
if(item.type == 'SIMPLE'){
startOp(!this.$verify.checkFieldSimpleRule(value,item.condOP,item.paramValue,item.ruleInfo,item.paramType,this.curEditRowData,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 数值范围
if(item.type == 'VALUERANGE2'){
startOp( !this.$verify.checkFieldValueRangeRule(value,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 正则式
if (item.type == "REGEX") {
startOp(!this.$verify.checkFieldRegExRule(value,item.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 长度
if (item.type == "STRINGLENGTH") {
startOp(!this.$verify.checkFieldStringLengthRule(value,item.minValue,item.isIncludeMinValue,item.maxValue,item.isIncludeMaxValue,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
// 系统值规则
if(item.type == "SYSVALUERULE") {
startOp(!this.$verify.checkFieldSysValueRule(value,item.sysRule.regExCode,item.ruleInfo,item.isKeyCond));
falg.infoMessage = item.ruleInfo;
if(!falg.isPast) return falg;
}
} catch(error) {
falg.infoMessage = item.ruleInfo;
startOp(false);
if(!falg.isPast) return falg;
}
// 分组
if(item.type == 'GROUP'){
......@@ -2232,11 +2424,11 @@ export default class MainBase extends Vue implements ControlInterface {
}
}
});
};
if(!falg.hasOwnProperty("isPast")){
falg.isPast = true;
}
if(!value){
if(!value && value != 0){
falg.isPast = true;
}
return falg;
......
......@@ -30,13 +30,13 @@ import java.util.List;
@SpringBootApplication(exclude = {
org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration.class,
})
public class webApplication extends WebMvcConfigurerAdapter{
public class webApplication extends WebMvcConfigurerAdapter {
@Autowired
SearchContextHandlerMethodArgumentResolver resolver;
public static void main(String[] args) {
SpringApplication.run(webApplication.class,args);
SpringApplication.run(webApplication.class, args);
}
@Override
......
......@@ -25,8 +25,8 @@ import org.springframework.beans.factory.annotation.Autowired;
@SpringBootApplication(exclude = {
})
@ComponentScan(basePackages = {"cn.ibizlab"}
// ,excludeFilters={
// @ComponentScan.Filter(type= org.springframework.context.annotation.FilterType.REGEX,pattern="cn.ibizlab.xxx.rest.xxx"),
// ,excludeFilters = {
// @ComponentScan.Filter(type= org.springframework.context.annotation.FilterType.REGEX, pattern="cn.ibizlab.xxx.rest.xxx"),
// }
)
@Import({
......@@ -34,13 +34,13 @@ import org.springframework.beans.factory.annotation.Autowired;
})
@EnableAsync
@EnableScheduling
public class DevBootApplication extends WebMvcConfigurerAdapter{
public class DevBootApplication extends WebMvcConfigurerAdapter {
@Autowired
SearchContextHandlerMethodArgumentResolver resolver;
public static void main(String[] args) {
SpringApplication.run(DevBootApplication.class,args);
SpringApplication.run(DevBootApplication.class, args);
}
@Override
......
......@@ -44,7 +44,7 @@ public class SDFileSearchContext extends QueryWrapperContext<SDFile> {
this.query=query;
if(!StringUtils.isEmpty(query)){
this.getSearchCond().and( wrapper ->
wrapper.like("filename", query)
wrapper.like("filename", query)
);
}
}
......
......@@ -10,7 +10,7 @@
"dedataset":[{"id":"Default" , "name":"DEFAULT"}],
"deaction":[{"id":"Create" , "name":"Create" , "type":"BUILTIN" },{"id":"Update" , "name":"Update" , "type":"BUILTIN" },{"id":"Remove" , "name":"Remove" , "type":"BUILTIN" },{"id":"Get" , "name":"Get" , "type":"BUILTIN" },{"id":"GetDraft" , "name":"GetDraft" , "type":"BUILTIN" },{"id":"CheckKey" , "name":"CheckKey" , "type":"BUILTIN" },{"id":"Save" , "name":"Save" , "type":"BUILTIN" }],
"datascope":[{"id":"all","name":"全部数据"}, {"id":"createman","name":"创建人"}]
}
}
],
"appmenus":[
......
......@@ -9,6 +9,8 @@
"table_name":"IBZFILE",
"system_id":"ibzdisk",
"system_name":"ibzdisk",
"module_id":"disk",
"module_name":"disk",
"fields":[
{
"fieldname":"FILEID" ,
......
......@@ -19,7 +19,7 @@ import org.springframework.context.annotation.Import;
@ConditionalOnClass(apiRestConfiguration.class)
@ConditionalOnWebApplication
@EnableConfigurationProperties(apiServiceProperties.class)
public class apiAutoConfiguration implements ApplicationContextAware{
public class apiAutoConfiguration implements ApplicationContextAware {
protected ApplicationContext applicationContext;
......
package cn.ibizlab.util.domain;
import com.alibaba.fastjson.annotation.JSONField;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
import cn.ibizlab.util.helper.DEFieldCacheMap;
import org.springframework.cglib.beans.BeanMap;
import org.springframework.data.annotation.Transient;
import org.springframework.util.StringUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import lombok.Data;
@Data
public class DTOBase implements Serializable {
......@@ -73,9 +77,44 @@ public class DTOBase implements Serializable {
return extensionparams;
}
@JsonIgnore
@JSONField(serialize = false)
@Transient
private BeanMap map;
private BeanMap getMap()
{
if(map==null) {
map=BeanMap.create(this);
}
return map;
}
public Object get(String field) {
String fieldRealName= DEFieldCacheMap.getFieldRealName(this.getClass(),field);
if(!StringUtils.isEmpty(fieldRealName)) {
return getMap().get(fieldRealName);
}
else {
return this.extensionparams.get(field.toLowerCase());
}
}
@JsonAnySetter
public void set(String name, Object value) {
extensionparams.put(name.toLowerCase(), value);
public void set(String field, Object value) {
field=field.toLowerCase();
String fieldRealName=DEFieldCacheMap.getFieldRealName(this.getClass(),field);
if(!StringUtils.isEmpty(fieldRealName)) {
if (value == null) {
getMap().put(fieldRealName, null);
}
else {
getMap().put(fieldRealName, DEFieldCacheMap.fieldValueOf(this.getClass(), fieldRealName, value));
}
}
else {
this.extensionparams.put(field.toLowerCase(),value);
}
}
}
......@@ -15,12 +15,12 @@ public interface AuthenticationUserService extends UserDetailsService {
@Override
@Cacheable( value="ibzuaa_users",key = "'getByUsername:'+#p0")
@Cacheable( value="ibzuaa_users", key = "'getByUsername:'+#p0")
AuthenticationUser loadUserByUsername(String username);
@Cacheable( value="ibzuaa_users",key = "'getByUsername:'+#p0")
@Cacheable( value="ibzuaa_users", key = "'getByUsername:'+#p0")
AuthenticationUser loadUserByLogin(String username,String password);
@CacheEvict( value="ibzuaa_users",key = "'getByUsername:'+#p0")
@CacheEvict( value="ibzuaa_users", key = "'getByUsername:'+#p0")
void resetByUsername(String username);
}
......@@ -26,39 +26,39 @@ public class IBZConfigService extends ServiceImpl<IBZConfigMapper, IBZConfig> im
@Value("${ibiz.admin.userid:0100}")
private String adminuserid;
@Cacheable( value="ibzrt_configs",key = "'cfgid:'+#p0+'||'+#p1+'||'+#p2")
@Cacheable(value="ibzrt_configs",key = "'cfgid:'+#p0+'||'+#p1+'||'+#p2")
public JSONObject getConfig(String cfgType,String targetType,String userId)
{
if(StringUtils.isEmpty(userId)||StringUtils.isEmpty(cfgType)||StringUtils.isEmpty(targetType)){
if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(cfgType) || StringUtils.isEmpty(targetType)) {
throw new BadRequestAlertException("获取配置失败,参数缺失","IBZConfig",cfgType);
}
IBZConfig config=this.getOne(Wrappers.query(IBZConfig.builder().systemId(systemId).cfgType(cfgType).targetType(targetType).userId(userId).build()),false);
if(config==null) {
config=this.getOne(Wrappers.query(IBZConfig.builder().systemId(systemId).cfgType(cfgType).targetType(targetType).userId(adminuserid).build()),false);
if(config==null) {
IBZConfig config = this.getOne(Wrappers.query(IBZConfig.builder().systemId(systemId).cfgType(cfgType).targetType(targetType).userId(userId).build()), false);
if(config == null) {
config = this.getOne(Wrappers.query(IBZConfig.builder().systemId(systemId).cfgType(cfgType).targetType(targetType).userId(adminuserid).build()), false);
if(config == null) {
return new JSONObject();
}
}
return JSON.parseObject(config.getCfg());
}
@CacheEvict( value="ibzrt_configs",key = "'cfgid:'+#p0+'||'+#p1+'||'+#p2")
public boolean saveConfig(String cfgType,String targetType,String userId,JSONObject config)
@CacheEvict(value="ibzrt_configs", key = "'cfgid:'+#p0+'||'+#p1+'||'+#p2")
public boolean saveConfig(String cfgType, String targetType, String userId, JSONObject config)
{
if(StringUtils.isEmpty(userId)||StringUtils.isEmpty(cfgType)||StringUtils.isEmpty(targetType)){
if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(cfgType) || StringUtils.isEmpty(targetType)) {
throw new BadRequestAlertException("保存配置失败,参数缺失","IBZConfig",cfgType);
}
String cfg="{}";
if(config!=null){
cfg=JSONObject.toJSONString(config);
String cfg = "{}";
if(config != null) {
cfg = JSONObject.toJSONString(config);
}
return this.saveOrUpdate(IBZConfig.builder().systemId(systemId).cfgType(cfgType).targetType(targetType).userId(userId).cfg(cfg).updateDate(DataObject.getNow()).build());
}
@CacheEvict( value="ibzrt_configs",key = "'cfgid:'+#p0+'||'+#p1+'||'+#p2")
public void resetConfig(String cfgType,String targetType,String userId)
@CacheEvict(value = "ibzrt_configs", key = "'cfgid:'+#p0+'||'+#p1+'||'+#p2")
public void resetConfig(String cfgType, String targetType, String userId)
{
if(StringUtils.isEmpty(userId)||StringUtils.isEmpty(cfgType)||StringUtils.isEmpty(targetType)){
if(StringUtils.isEmpty(userId) || StringUtils.isEmpty(cfgType) || StringUtils.isEmpty(targetType)) {
throw new BadRequestAlertException("重置配置失败,参数缺失","IBZConfig",cfgType);
}
this.remove(Wrappers.query(IBZConfig.builder().systemId(systemId).cfgType(cfgType).targetType(targetType).userId(userId).build()));
......
......@@ -11,9 +11,9 @@ import java.util.Map;
*/
public interface IBZDataAuditService {
@Async("asyncExecutor")
void createAudit(HttpServletRequest request,EntityBase entity,Object idValue,Map<String, Audit> auditFields);
void createAudit(HttpServletRequest request, EntityBase entity, Object idValue, Map<String, Audit> auditFields);
@Async("asyncExecutor")
void updateAudit(HttpServletRequest request, EntityBase beforeEntity, Object serviceObj, Object idValue, Map<String, Audit> auditFields);
@Async("asyncExecutor")
void removeAudit(HttpServletRequest request,EntityBase entity,Object idValue,Map<String, Audit> auditFields);
void removeAudit(HttpServletRequest request, EntityBase entity, Object idValue, Map<String, Audit> auditFields);
}
\ No newline at end of file
......@@ -26,8 +26,8 @@ public class IBZUAAUserService implements AuthenticationUserService{
@Override
public AuthenticationUser loadUserByUsername(String username) {
AuthenticationUser user=uaaFeignClient.loginByUsername(username);
if(user==null){
AuthenticationUser user = uaaFeignClient.loginByUsername(username);
if(user == null) {
throw new BadRequestAlertException("登录失败","IBZUAAUser",username);
}
return user;
......@@ -35,9 +35,9 @@ public class IBZUAAUserService implements AuthenticationUserService{
@Override
public AuthenticationUser loadUserByLogin(String username, String password) {
String[] data=username.split("[|]");
String loginname=username;
String domains="";
String[] data = username.split("[|]");
String loginname = username;
String domains = "";
if(data.length==2) {
loginname=data[0].trim();
......@@ -47,9 +47,9 @@ public class IBZUAAUserService implements AuthenticationUserService{
logininfo.setDomain(domains);
logininfo.setLoginname(loginname);
logininfo.setPassword(password);
AuthenticationUser user=uaaFeignClient.login(logininfo);
if(user==null){
throw new BadRequestAlertException("登录失败","IBZUAAUser",username);
AuthenticationUser user = uaaFeignClient.login(logininfo);
if(user == null){
throw new BadRequestAlertException("登录失败","IBZUAAUser", username);
}
return user;
}
......
......@@ -49,19 +49,19 @@ public class RemoteService {
*/
public interface RemoteFeignClient {
@RequestMapping(method = RequestMethod.POST, value = "/{path}")
JSONObject post( @PathVariable("path") String path, @RequestHeader("Authorization") String token,@RequestBody Map param);
JSONObject post( @PathVariable("path") String path, @RequestHeader("Authorization") String token, @RequestBody Map param);
@RequestMapping(method = RequestMethod.GET, value = "/{path}")
JSONObject request( @PathVariable("path") String path, @RequestHeader("Authorization") String token,Map param);
JSONObject request( @PathVariable("path") String path, @RequestHeader("Authorization") String token, Map param);
@RequestMapping(method = RequestMethod.GET, value = "/{path}")
JSONObject get( @PathVariable("path") String path, @RequestHeader("Authorization") String token);
@RequestMapping(method = RequestMethod.PUT, value = "/{path}")
JSONObject put( @PathVariable("path") String path, @RequestHeader("Authorization") String token,@RequestBody Map param);
JSONObject put( @PathVariable("path") String path, @RequestHeader("Authorization") String token,@RequestBody Map param);
@RequestMapping(method = RequestMethod.DELETE, value = "/{path}")
JSONObject delete( @PathVariable("path") String path, @RequestHeader("Authorization") String token);
JSONObject delete(@PathVariable("path") String path, @RequestHeader("Authorization") String token);
}
/**
......@@ -115,6 +115,4 @@ public class RemoteService {
final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(jsonConverter);
return () -> httpMessageConverters;
}
}
\ No newline at end of file
......@@ -68,7 +68,7 @@ public class SimpleAuditService extends ServiceImpl<IBZDataAuditMapper, IBZDataA
public void createAudit(HttpServletRequest request, EntityBase entity, Object idValue, Map<String, Audit> auditFields) {
IBZDataAudit dataAudit = new IBZDataAudit();
dataAudit.setOppersonid(AuthenticationUser.getAuthenticationUser().getUserid());
dataAudit.setOppersonname(String.format("%s[%s]",AuthenticationUser.getAuthenticationUser().getPersonname(),AuthenticationUser.getAuthenticationUser().getOrgname()));
dataAudit.setOppersonname(String.format("%s[%s]", AuthenticationUser.getAuthenticationUser().getPersonname(), AuthenticationUser.getAuthenticationUser().getOrgname()));
dataAudit.setAudittype("CREATE");
dataAudit.setAuditobject(entity.getClass().getSimpleName());
dataAudit.setAuditobjectdata(idValue);
......
......@@ -31,14 +31,14 @@ public class SearchContextHandlerMethodArgumentResolver implements HandlerMethod
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
Map<String, String[]> params = webRequest.getParameterMap();
LinkedHashMap<String,Object> set=new LinkedHashMap<>();
LinkedHashMap<String,Object> set = new LinkedHashMap<>();
for (String key : params.keySet()) {
set.put(key,params.get(key)[0]);
}
if((!set.containsKey("size")) ){
set.put("size",pageLimit);
set.put("size", pageLimit);
}
String json=objectMapper.writeValueAsString(set);
return objectMapper.readValue(json,parameter.getParameterType());
String json = objectMapper.writeValueAsString(set);
return objectMapper.readValue(json, parameter.getParameterType());
}
}
\ No newline at end of file
......@@ -3,7 +3,7 @@ spring:
cloud:
nacos:
discovery:
server-addr: 172.16.102.211:8848
server-addr: 172.16.100.243:8848
enabled: true
eureka:
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册