UiPermission.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <template>
  2. <app-scroll-box class="page-clientsManage">
  3. <el-row class="pa-20">
  4. <el-card class="table-card mt-20">
  5. <el-row slot="header" class="clearfix">
  6. <el-row class="fl">
  7. <span class="title">疫区设置:{{ itemTitle }}</span>
  8. </el-row>
  9. </el-row>
  10. <div class="deliverySetting">
  11. <div class="deliverySetting-table" v-for="(item, idx) in countries" :key="idx">
  12. <div class="table-body" v-for="(pro, idx2) in item.pros" :key="idx2">
  13. <div class="first-col">
  14. <span
  15. v-if="idx2 == 0"
  16. style="display: inline-block; line-height: 30px; cursor: pointer; "
  17. >
  18. <el-checkbox @change="handleChecked('country', item)" :label="item.cname" v-model="item.checked" :key="item.cid">{{ item.cname }}</el-checkbox>
  19. </span>
  20. </div>
  21. <div class="width120">
  22. <span style="display: inline-block; line-height: 30px; cursor: pointer; ">
  23. <el-checkbox @change="handleChecked('pro', pro)" :label="pro.pname" v-model="pro.checked" :key="pro.pid">{{ pro.pname }}</el-checkbox>
  24. </span>
  25. </div>
  26. <div class="width265">
  27. <el-checkbox
  28. v-for="c in pro.cities"
  29. v-model="c.checked"
  30. :label="c.cityName"
  31. :key="c.cityId"
  32. @change="handleChecked('city', c)"
  33. >{{c.cityName}}</el-checkbox>
  34. </div>
  35. </div>
  36. </div>
  37. </div>
  38. </el-card>
  39. </el-row>
  40. </app-scroll-box>
  41. </template>
  42. <script>
  43. export default {
  44. components: {},
  45. props: {},
  46. data() {
  47. return {
  48. itemTitle: "",
  49. itemId: 0,
  50. countries: [
  51. {
  52. cid: 1,
  53. cname: "中国",
  54. pid: "1",
  55. pname: "广东",
  56. cityId: 1,
  57. cityName: "深圳"
  58. },
  59. {
  60. cid: 1,
  61. cname: "中国",
  62. pid: "1",
  63. pname: "广东",
  64. cityId: 2,
  65. cityName: "肇庆"
  66. },
  67. {
  68. cid: 1,
  69. cname: "中国",
  70. pid: "2",
  71. pname: "湖北",
  72. cityId: 3,
  73. cityName: "武汉"
  74. },
  75. {
  76. cid: 1,
  77. cname: "中国",
  78. pid: "2",
  79. pname: "湖北",
  80. cityId: 4,
  81. cityName: "咸宁"
  82. },
  83. {
  84. cid: 1,
  85. cname: "中国",
  86. pid: "2",
  87. pname: "湖北",
  88. cityId: 5,
  89. cityName: "恩施"
  90. },
  91. {
  92. cid: 2,
  93. cname: "美国",
  94. pid: "3",
  95. pname: "usa省州1",
  96. cityId: 6,
  97. cityName: "usa-city-1"
  98. },
  99. {
  100. cid: 2,
  101. cname: "美国",
  102. pid: "3",
  103. pname: "usa省州1",
  104. cityId: 7,
  105. cityName: "usa-city-2"
  106. },
  107. {
  108. cid: 2,
  109. cname: "美国",
  110. pid: "3",
  111. pname: "usa省州1",
  112. cityId: 8,
  113. cityName: "usa-city-3"
  114. },
  115. {
  116. cid: 2,
  117. cname: "美国",
  118. pid: "4",
  119. pname: "usa省州2",
  120. cityId: 9,
  121. cityName: "usa-city-4"
  122. },
  123. {
  124. cid: 2,
  125. cname: "美国",
  126. pid: "4",
  127. pname: "usa省州2",
  128. cityId: 10,
  129. cityName: "usa-city-5"
  130. }
  131. ],
  132. checkedCities: [1, 4, 9, 10]
  133. };
  134. },
  135. computed: {},
  136. methods: {
  137. initPage() {
  138. let { itemId, itemTitle } = this.$route.query;
  139. this.itemId = itemId;
  140. this.itemTitle = itemTitle;
  141. this.initAreaData();
  142. },
  143. //初始化数据
  144. initAreaData() {
  145. this.countries = this.countries.map(item => {
  146. let res = item;
  147. if (this.checkedCities.includes(item.cityId)) {
  148. res.checked = true;
  149. } else {
  150. res.checked = false;
  151. }
  152. return res;
  153. });
  154. let resCities = [];
  155. this.countries.forEach(item => {
  156. let obj = {};
  157. let existsCountry = resCities.find(c => {
  158. return c.cid == item.cid;
  159. });
  160. if (existsCountry) {
  161. obj = existsCountry;
  162. } else {
  163. obj.cid = item.cid;
  164. obj.cname = item.cname;
  165. }
  166. obj.checked = false;
  167. if (!obj.pros) {
  168. obj.pros = [];
  169. }
  170. let existsPro = obj.pros.find(c => {
  171. return c.pid == item.pid;
  172. });
  173. if (!existsPro) {
  174. existsPro = {
  175. pid: item.pid,
  176. pname: item.pname,
  177. checked: false
  178. };
  179. obj.pros.push(existsPro);
  180. }
  181. if (!existsPro.cities) {
  182. existsPro.cities = [];
  183. }
  184. existsPro.cities.push({
  185. cityId: item.cityId,
  186. cityName: item.cityName,
  187. checked: item.checked
  188. });
  189. if (!existsCountry) {
  190. resCities.push(obj);
  191. }
  192. });
  193. this.countries = resCities;
  194. this.opreationData()
  195. },
  196. //操作数据
  197. opreationData() {
  198. this.countries.forEach(c => {
  199. c.pros.forEach(p => {
  200. if(p.cities && p.cities.length > 0){
  201. p.checked = p.cities.every(p => p.checked)
  202. }
  203. })
  204. if(c.pros && c.pros.length > 0){
  205. c.checked = c.pros.every(p => p.checked)
  206. }
  207. })
  208. },
  209. handleChecked(level, item) {
  210. let isChecked = item.checked
  211. switch(level){
  212. case "country":
  213. if(item && item.pros){
  214. item.pros.forEach(p => {
  215. if(p.cities){
  216. p.cities.forEach(c => {
  217. c.checked = isChecked
  218. })
  219. }
  220. })
  221. }
  222. break;
  223. case "pro":
  224. if(item && item.cities){
  225. item.cities.forEach(c => {
  226. c.checked = isChecked
  227. })
  228. }
  229. break;
  230. case "city":
  231. break;
  232. }
  233. this.opreationData()
  234. }
  235. },
  236. created: function() {},
  237. mounted() {
  238. this.initPage();
  239. },
  240. watch: {}
  241. };
  242. </script>
  243. <style>
  244. .el-checkbox__label {
  245. padding-left: 5px;
  246. }
  247. .first-col {
  248. padding-left: 20px;
  249. width: 120px;
  250. }
  251. .deliverySetting {
  252. padding: 20px 0;
  253. position: relative;
  254. }
  255. .deliverySetting .el-table thead tr th {
  256. font-size: 14px;
  257. }
  258. .deliverySetting .el-table tbody tr td {
  259. vertical-align: baseline;
  260. }
  261. .deliverySetting .el-table tbody tr td p {
  262. line-height: 30px;
  263. }
  264. .deliverySetting .el-table tbody tr td .el-checkbox-group {
  265. display: flex;
  266. flex-direction: column;
  267. }
  268. .deliverySetting .el-table tbody tr td .el-checkbox-group label {
  269. line-height: 30px;
  270. margin-left: 0;
  271. }
  272. .deliverySetting .deliverySetting-table {
  273. font-size: 14px;
  274. color: #333;
  275. }
  276. .deliverySetting .deliverySetting-table .table-head,
  277. .deliverySetting .deliverySetting-table .table-body {
  278. display: flex;
  279. padding: 10px 0;
  280. }
  281. .deliverySetting .deliverySetting-table .table-head .selection,
  282. .deliverySetting .deliverySetting-table .table-body .selection {
  283. /* width: 45px; */
  284. text-align: center;
  285. line-height: 36px;
  286. }
  287. .deliverySetting .deliverySetting-table .table-head .width120,
  288. .deliverySetting .deliverySetting-table .table-body .width120 {
  289. width: 120px;
  290. }
  291. /* .deliverySetting .deliverySetting-table .table-head .width265,
  292. .deliverySetting .deliverySetting-table .table-body .width265 {
  293. width: 265px;
  294. } */
  295. .deliverySetting .deliverySetting-table .table-head {
  296. height: 36px;
  297. align-items: center;
  298. background-color: #e7f2ff;
  299. }
  300. .deliverySetting .deliverySetting-table .table-body {
  301. border-bottom: 1px solid #e4e4e4;
  302. color: #666;
  303. }
  304. .deliverySetting .deliverySetting-table .table-body:hover {
  305. background-color: #f5f7fa;
  306. }
  307. /* .deliverySetting .deliverySetting-table .table-body .width265 {
  308. display: flex;
  309. flex-direction: column;
  310. } */
  311. .deliverySetting .deliverySetting-table .table-body .width265 label {
  312. line-height: 30px;
  313. margin-left: 0;
  314. color: #666;
  315. padding: 0 5px;
  316. }
  317. .deliverySetting .deliverySetting-table .table-body p {
  318. line-height: 30px;
  319. }
  320. .deliverySetting .deliverySetting-btn {
  321. /*width: 100%;*/
  322. height: 59px;
  323. display: flex;
  324. justify-content: flex-end;
  325. align-items: center;
  326. position: absolute;
  327. top: -55px;
  328. right: -16px;
  329. z-index: 100;
  330. }
  331. .deliverySetting .deliverySetting-btn .tabs-btn {
  332. min-width: 90px;
  333. height: 34px;
  334. line-height: 32px;
  335. padding: 0 10px;
  336. color: #2387f7;
  337. border: solid 1px #4fa2ff;
  338. background-color: #e7f2ff;
  339. cursor: pointer;
  340. }
  341. .deliverySetting .deliverySetting-btn .tabs-btn:nth-of-type(2) {
  342. margin: 0 15px;
  343. }
  344. .deliverySetting .deliverySetting-btn .tabs-btn input {
  345. border: none;
  346. background: transparent;
  347. color: inherit;
  348. cursor: inherit;
  349. outline: none;
  350. margin: 0;
  351. padding: 0;
  352. }
  353. .deliverySetting .deliverySetting-btn .tabs-btn:hover {
  354. color: #fff;
  355. background-color: #2387f7;
  356. }
  357. .deliverySetting .setDistributorDailog .el-input {
  358. width: 270px;
  359. }
  360. </style>