relation-tree.php 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272
  1. <?php
  2. /*
  3. * @Description: 查询节点
  4. * @Author: lun
  5. * @Date: 2022-04-25 16:16:34
  6. * @Copyright: copyright (c) 2021 广东七件事集团
  7. */
  8. ?>
  9. <link rel="stylesheet" href="/resources/unpkg/orgchart/jquery.orgchart.min.css">
  10. <style>
  11. #jOrgChart {
  12. position: relative;
  13. height: 1000px;
  14. margin: 0.5rem;
  15. overflow: auto;
  16. text-align: center;
  17. }
  18. </style>
  19. <div id="app" v-cloak>
  20. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  21. <div slot="header">
  22. <el-page-header @back="$navigate({r: 'double-copy/default/index'})" content="关系树状图"></el-page-header>
  23. </div>
  24. <div class="table-body">
  25. <div class="input-item">
  26. <el-input style="max-width: 200px;" size="small" placeholder="请输入用户ID" v-model="search.user_id" clearable ></el-input>
  27. <el-button type="primary" size="small" :loading="listLoading" @click="toSearch">搜索</el-button>
  28. </div>
  29. <!-- 节点图 -->
  30. <div class="dataBox" id="jOrgChart"></div>
  31. </div>
  32. </el-card>
  33. <!-- -->
  34. <div class="detailcontent">
  35. <el-popover
  36. placement="top"
  37. width="200"
  38. trigger="manual"
  39. v-model="visible">
  40. <div>
  41. <div >{{detailcontent.id}}</div>
  42. <div >{{detailcontent.id}}--</div>
  43. <div >位置{{detailcontent.pos}}</div>
  44. </div>
  45. </el-popover>
  46. </div>
  47. <!-- 这个是复制用的容器,已隐藏 -->
  48. <textarea id="inputs" style="opacity: 0;width: 0;height: 0;">这是幕后黑手</textarea>
  49. </div>
  50. <script src="/resources/unpkg/jquery@3.3.1/dist/jquery.min.js"></script>
  51. <script src="/resources/unpkg/orgchart/jquery.orgchart.min.js"></script>
  52. <script type="text/javascript">
  53. const app = new Vue({
  54. el: '#app',
  55. data() {
  56. return {
  57. detailcontent:{},
  58. listLoading:false,
  59. zoomnum:2,
  60. search: {
  61. user_id: null,
  62. },
  63. datascource:{},
  64. visible:false,
  65. ischildren:false,
  66. elementchart:'', //要渲染的idming
  67. }
  68. },
  69. computed: {
  70. },
  71. created() {
  72. },
  73. mounted () {
  74. vueObj = this
  75. $('#jOrgChart').delegate('.node_list', 'mouseover', function() {
  76. $(this).find(".detailcontent").addClass('detailcontent1')
  77. })
  78. $('#jOrgChart').delegate('.node_list', 'mouseout', function() {
  79. $(this).find(".detailcontent").removeClass('detailcontent1')
  80. })
  81. $('#jOrgChart').delegate('.copy', 'click', function() {
  82. console.log($(this))
  83. let id = $(this)[0].id
  84. let idnum = id.substr(5,id.length)
  85. var url = $('#'+idnum).find('.title').html();
  86. url = url.replace('<i class="oci oci-leader symbol"></i>', '');// 替换掉
  87. // createElement() 方法通过指定名称创建一个元素
  88. var copyInput = document.createElement('input')
  89. copyInput.setAttribute('value', url)
  90. document.body.appendChild(copyInput)
  91. copyInput.select()
  92. try {
  93. var copyed = document.execCommand('copy')
  94. if (copyed) {
  95. document.body.removeChild(copyInput)
  96. vueObj.$message.success('复制成功')
  97. }
  98. } catch {
  99. vueObj.$message.success('复制失败,请检查浏览器兼容')
  100. }
  101. });
  102. },
  103. methods: {
  104. toSearch() {
  105. if(this.search.user_id !== '') {
  106. this.getquerynodeList();
  107. }
  108. },
  109. getquerynodeList(startTime = null, endTime = null) {
  110. let self = this;
  111. // self.listLoading = true;
  112. $('#jOrgChart').remove
  113. $("#jOrgChart").empty()
  114. this.datascource = {}
  115. request({
  116. params: {
  117. r: 'double-copy/default/relation-tree',
  118. },
  119. data:{user_id: this.search.user_id},
  120. method: 'post',
  121. }).then(e => {
  122. self.listLoading = false;
  123. if (e.data.code === 0) {
  124. self.datascource = e.data.data[0]
  125. self.chartFun(self.datascource)
  126. } else {
  127. self.$message.error(e.data.msg);
  128. }
  129. }).catch(e => {
  130. console.log(e);
  131. });
  132. },
  133. chartFun(datascource){
  134. vueObject = this
  135. let OrgChart = ''
  136. if(this.ischildren == true){
  137. // let elementchart = this.elementchart
  138. // $('.node_'+OrgChart).append("<ul class='nodes' id='OrgChart-"+elementchart+"'></ul>")
  139. OrgChart = 'OrgChart-'+this.elementchart
  140. }else{
  141. OrgChart = 'jOrgChart'
  142. }
  143. var oc = $('#'+OrgChart).orgchart({
  144. 'data': datascource,
  145. 'depth': 20,
  146. 'nodeContent': 'nickname',
  147. 'nodeID': 'id',
  148. 'pan':true,
  149. 'zoom':true,
  150. 'direction': 't2b',
  151. 'createNode': function($node, data) {
  152. $node.addClass('node_'+data.id);
  153. $node.appendTo("#node_"+data.id);
  154. $node.addClass('node_list');
  155. let secondMenuIcon = $("<i class='copy el-icon-document-copy' id='copy-"+data.id+"'></i>", {
  156. 'class': 'el-icon-info',
  157. onClick: function() {
  158. console.log(55555)
  159. console.log(22,$(this))
  160. }
  161. });
  162. let slip = data.is_three_copy == 1 && (data.pid != data.original_pid) ? "<span class='slip'>【滑落】</span>" : "";
  163. let secondMenu = "<div class='second-menu' >"+data.pos+ slip + "</div>";
  164. let original = data.is_three_copy == 1 ? " <div > 原上级ID:" + data.original_pid + "</div> " : "";
  165. let thridMenu = "<div class='detailcontent'>"+
  166. " <div > 会员ID:"+data.name+"</div> "+
  167. " <div > 位置:"+data.pos+"</div> "+
  168. " <div > 等级:"+data.level_name+"</div> "+
  169. " <div > 上级ID:"+data.pid+"</div> "+
  170. original+
  171. " <div > 平台补贴用户:"+data.topid+"</div> "+
  172. " <div > 助力人数:"+data.help_num+"</div> "+
  173. " <div > 创建时间:"+data.created_at+"</div> "+
  174. " </div>" ;
  175. $node.append(secondMenuIcon).append(secondMenu).append(thridMenu)
  176. }
  177. });
  178. },
  179. }
  180. });
  181. </script>
  182. <style>
  183. #app{
  184. }
  185. .table-body{
  186. height: auto;
  187. }
  188. .copy{
  189. position: absolute;
  190. bottom: 106px;
  191. left: 155px;
  192. color: #fff;
  193. width: 43px;
  194. font-weight: 700;
  195. font-size: 14px;
  196. transform: rotate(-90deg) translate(-45px,-45px) rotateY(180deg);
  197. transform-origin: bottom center;
  198. cursor: pointer;
  199. }
  200. .orgchart .hierarchy::before{
  201. border-top: 2px solid #409EFF;
  202. }
  203. .orgchart>ul>li>ul li>.node::before{
  204. background-color:#409EFF;
  205. }
  206. .orgchart .node:not(:only-child)::after{
  207. background-color:#409EFF;
  208. }
  209. .orgchart .node .content{
  210. border:1px solid #409EFF ;
  211. }
  212. .orgchart .node .title{
  213. background-color:#409EFF;
  214. }
  215. .detailcontent1{
  216. display: block !important;
  217. }
  218. page{
  219. background: #fff;
  220. }
  221. .node_list{
  222. position: relative;
  223. }
  224. .detailcontent{
  225. position: absolute;
  226. top: -40px;
  227. left: -235px;
  228. width: 231px;
  229. background: #fff;
  230. color: #000;
  231. padding: 10px;
  232. border-radius: 5px;
  233. display: none;
  234. box-shadow: -1px 6px 10px grey;
  235. z-index: 99;
  236. text-align: left;
  237. }
  238. .detailcontent div{
  239. line-height: 22px;
  240. }
  241. .orgchart .node .content{
  242. border-radius: 0;
  243. }
  244. .orgchart.l2r .node, .orgchart.r2l .node{
  245. width: 70px;
  246. }
  247. .second-menu{
  248. transform-origin: top center;
  249. width: 130px;
  250. height: 26px;
  251. border:1px solid #409EFF ;
  252. border-top: 0;
  253. }
  254. .orgchart .node{
  255. padding: 6px;
  256. }
  257. .slip {
  258. color: #409EFF;
  259. }
  260. </style>