feature(优化作价平台):
1. 接入es提升查询效率 2. 配置一套module,查询买卖成交案例 3. 配置住宅租赁汇总案例module 3. 新增菜单icon
26
ruoyi-ui/src/api/data/aggregateResidenceRentCase.js
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询住宅销售基价修正列表
|
||||||
|
export function list(query) {
|
||||||
|
return request({
|
||||||
|
url: '/data/cases/residence/aggregate-rent-case/list',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出住宅销售基价修正
|
||||||
|
export function export2File(query) {
|
||||||
|
return request({
|
||||||
|
url: '/data/cases/residence/aggregate-rent-case/export',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getYearMonthList() {
|
||||||
|
return request({
|
||||||
|
url: '/data/cases/residence/aggregate-rent-case/yearmonth',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
1
ruoyi-ui/src/assets/icons/svg/adjust.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597113718881" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4634" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M178.7 312.2c11 0 19.9-8.9 19.9-20.8 0-49.2 40.1-89.2 89.3-89.2 16.1 0 31.4 4.8 45 10.7 1.5 0.9 3.2 1.4 4.7 2.4l-15 17.5c-2.6 3.1-3.4 7.2-2.1 10.8 1.3 3.3 4.1 5.6 7.6 6.1l76.3 11.4c3.4 0 6.7-1.7 8.8-4.6 2.1-2.9 2.7-6.3 1.7-9.6l-22.3-72.2c-1.3-4.1-4.9-6.8-9.3-6.8-3.1 0-6.1 1.4-8.3 3.9l-11 16.5c-22.6-16.8-48.9-25.7-76.1-25.7-71.1 0-129 57.9-129 129.8 0 10.9 8.9 19.8 19.8 19.8zM396.8 270.1c-10.9 0-19.8 8.9-19.7 21.4 0 49.2-40.1 89.3-89.3 89.3-15.1 0-29.8-4.4-43.2-9.8-1.7-0.9-3.6-1.5-5.2-2.6l15.1-16.7c2.7-3 3.6-7.1 2.4-10.7-1.2-3.3-4-5.7-7.4-6.3l-76.3-13.2c-3.4 0-6.6 1.7-8.7 4.5-2.1 2.8-2.8 6.2-1.9 9.4l20.6 72.8c1.2 4.2 4.9 7 9.3 7 3.1 0 6-1.4 8.1-3.7l11.4-16.1c22.2 16.4 48.4 25.1 75.8 25.1 71.1 0 129-57.9 128.6-131.5-0.4-10.6-9.1-18.9-19.6-18.9zM481 481.7H207.9c-17.9 0-32.5 14.6-32.5 32.5s14.6 32.5 32.5 32.5H481c17.9 0 32.5-14.6 32.5-32.5 0-17.8-14.6-32.5-32.5-32.5z" p-id="4635" fill="#BFBFBF"></path><path d="M161.7 837.5c-26.1 0-47.3-21.2-47.3-47.3V106c0-26.1 21.2-47.3 47.3-47.3h320.7v88.6c0 46.8 38.1 84.9 84.9 84.9h95.1l5.3 4.5 0.5 4.6v322.1H727V241.2l-0.5-5.7c-1.3-23-10.3-44.7-25.3-61.3L572.6 32.7C553.7 11.9 526.8 0 498.8 0H161.7c-58.5 0-106 47.5-106 106v684.3c0 58.4 47.6 106 106 106h347.2v-58.7H161.7z" p-id="4636" fill="#BFBFBF"></path><path d="M511.5 640.6c2.9-15.9 10.5-30.2 21.1-42.4H207.9c-17.9 0-32.5 14.6-32.5 32.5s14.6 32.5 32.5 32.5h301v-14.8l2.6-7.8zM175.3 747.1c0 17.9 14.6 32.5 32.5 32.5h301v-65.1h-301c-17.8 0.1-32.5 14.7-32.5 32.6zM926.1 1022.8H602.3c-0.7-0.3-1.5-0.6-2.2-0.8-18.7-3.4-31.2-14.1-37.6-32-1.1-3.1-1.7-6.4-2.5-9.5V656.8c0.3-0.7 0.6-1.5 0.8-2.2 3.8-20.6 16.1-33.3 36.2-38.7 1.8-0.5 3.6-0.9 5.3-1.3h278.3c11.6 2.6 20.7 9.5 28.9 17.4 13.7 13.1 27.2 26.6 40.3 40.2 8.3 8.6 15.7 18 18.4 30.1v278.3c-0.3 0.7-0.6 1.5-0.8 2.2-3.8 20.6-16.1 33.3-36.2 38.7-1.6 0.5-3.4 0.9-5.1 1.3m-161.9-15.6h139.1c11.8 0 18-6.2 18-17.9V836.6c0-11.7-6.3-18-17.9-18H624.8c-11.4 0-17.8 6.3-17.8 17.7v153.1c0 1.8 0 3.7 0.5 5.5 1.9 8.1 8 12.3 17.6 12.3h139.1m-8-235.5h99.2c12.7 0 18.8-6.1 18.8-18.8v-104c0-12.8-6-18.8-18.8-18.8H656.9c-12.5 0-18.7 6.1-18.7 18.5V753c0 12.4 6.2 18.6 18.6 18.6 33.3 0.1 66.3 0.1 99.4 0.1M796 646.2h46.1v109.2H796V646.2" p-id="4637" fill="#BFBFBF"></path></svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
ruoyi-ui/src/assets/icons/svg/basicPrice.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597125639935" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13471" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M192 672c19.2 0 32 12.8 32 32v128c0 19.2-12.8 32-32 32s-32-12.8-32-32v-128c0-19.2 12.8-32 32-32zM416 480c19.2 0 32 12.8 32 32v320c0 19.2-12.8 32-32 32s-32-12.8-32-32V512c0-19.2 12.8-32 32-32zM608 608c19.2 0 32 12.8 32 32v192c0 19.2-12.8 32-32 32s-32-12.8-32-32v-192c0-19.2 12.8-32 32-32zM832 448c19.2 0 32 12.8 32 32v352c0 19.2-12.8 32-32 32s-32-12.8-32-32V480c0-19.2 12.8-32 32-32z" fill="#BFBFBF" p-id="13472"></path><path d="M419.2 323.2l-246.4 246.4c-12.8 12.8-32 12.8-44.8 0-12.8-12.8-12.8-32 0-44.8l291.2-291.2 192 192 217.6-217.6c12.8-12.8 32-12.8 44.8 0 12.8 12.8 12.8 32 0 44.8l-262.4 262.4-192-192z" fill="#BFBFBF" p-id="13473"></path></svg>
|
After Width: | Height: | Size: 1.0 KiB |
1
ruoyi-ui/src/assets/icons/svg/business.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597113833754" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6873" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M510.9 565.9L374.7 429.7c-5.4-5.4-5.4-14.1 0-19.4s14.1-5.4 19.4 0L510.9 527l115.7-115.7c5.4-5.4 14.1-5.4 19.4 0 5.4 5.4 5.4 14.1 0 19.4L510.9 565.9z" fill="#BFBFBF" p-id="6874"></path><path d="M636.4 560.2h-252c-7.6 0-13.7-6.1-13.7-13.7s6.1-13.7 13.7-13.7h251.9c7.6 0 13.7 6.1 13.7 13.7 0.1 7.5-6.1 13.7-13.6 13.7zM636.4 656.1h-252c-7.6 0-13.7-6.1-13.7-13.7s6.1-13.7 13.7-13.7h251.9c7.6 0 13.7 6.1 13.7 13.7 0.1 7.5-6.1 13.7-13.6 13.7z" fill="#BFBFBF" p-id="6875"></path><path d="M510.9 784.6c-7.6 0-13.7-6.1-13.7-13.7V546.5c0-7.6 6.1-13.7 13.7-13.7s13.7 6.1 13.7 13.7v224.4c0 7.5-6.1 13.7-13.7 13.7z" fill="#BFBFBF" p-id="6876"></path><path d="M946 513.4c-3.1 0-6.1-1-8.7-3.1L521.4 169.2c-6.2-5.1-15.1-5.1-21.3 0L86.7 507.9c-5.9 4.8-14.5 3.9-19.3-1.9-4.8-5.9-3.9-14.5 1.9-19.3L482.7 148c16.3-13.3 39.8-13.3 56.1 0l415.9 341.1c5.9 4.8 6.7 13.5 1.9 19.3-2.7 3.3-6.6 5-10.6 5z" fill="#BFBFBF" p-id="6877"></path><path d="M752.8 886.1H268c-41.3 0-74.9-33.6-74.9-74.9V391.7c0-7.6 6.1-13.7 13.7-13.7s13.7 6.1 13.7 13.7v419.4c0 26.2 21.3 47.5 47.5 47.5h484.8c26.2 0 47.5-21.3 47.5-47.5V391.7c0-7.6 6.1-13.7 13.7-13.7s13.7 6.1 13.7 13.7v419.4c0 41.3-33.6 75-74.9 75z" fill="#BFBFBF" p-id="6878"></path></svg>
|
After Width: | Height: | Size: 1.5 KiB |
1
ruoyi-ui/src/assets/icons/svg/compute.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597125321332" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="10786" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M869.262222 116.053333H571.164444c-20.48 0-36.408889 15.928889-36.408888 36.408889v300.373334c0 20.48 15.928889 36.408889 36.408888 36.408888h298.097778c20.48 0 36.408889-15.928889 36.408889-36.408888V152.462222c0-20.48-15.928889-36.408889-36.408889-36.408889z m-75.093333 211.626667h-150.186667c-15.928889 0-29.582222-11.377778-29.582222-25.031111 0-13.653333 13.653333-25.031111 29.582222-25.031111h150.186667c15.928889 0 29.582222 11.377778 29.582222 25.031111 0 13.653333-13.653333 25.031111-29.582222 25.031111z m0 0M436.906667 116.053333H138.808889c-20.48 0-36.408889 15.928889-36.408889 36.408889v300.373334c0 20.48 15.928889 36.408889 36.408889 36.408888h298.097778c20.48 0 36.408889-15.928889 36.408889-36.408888V152.462222c0-20.48-15.928889-36.408889-36.408889-36.408889z m-75.093334 211.626667h-50.062222v50.062222c0 15.928889-11.377778 29.582222-25.031111 29.582222-13.653333 0-25.031111-13.653333-25.031111-29.582222v-50.062222H211.626667c-15.928889 0-29.582222-11.377778-29.582223-25.031111 0-13.653333 13.653333-25.031111 29.582223-25.031111h50.062222V227.555556c0-15.928889 11.377778-29.582222 25.031111-29.582223 13.653333 0 25.031111 13.653333 25.031111 29.582223v50.062222h50.062222c15.928889 0 29.582222 11.377778 29.582223 25.031111 0 13.653333-13.653333 25.031111-29.582223 25.031111z m0 0M436.906667 546.133333H138.808889c-20.48 0-36.408889 15.928889-36.408889 36.408889v300.373334c0 20.48 15.928889 36.408889 36.408889 36.408888h298.097778c20.48 0 36.408889-15.928889 36.408889-36.408888V582.542222c0-20.48-15.928889-36.408889-36.408889-36.408889z m-150.186667 81.92c15.928889 0 29.582222 13.653333 29.582222 29.582223 0 15.928889-13.653333 29.582222-29.582222 29.582222-15.928889 0-29.582222-13.653333-29.582222-29.582222 2.275556-15.928889 13.653333-29.582222 29.582222-29.582223z m0 209.351111c-15.928889 0-29.582222-13.653333-29.582222-29.582222 0-15.928889 13.653333-29.582222 29.582222-29.582222 15.928889 0 29.582222 13.653333 29.582222 29.582222 0 18.204444-13.653333 29.582222-29.582222 29.582222z m75.093333-79.644444H211.626667c-15.928889 0-29.582222-11.377778-29.582223-25.031111 0-13.653333 13.653333-25.031111 29.582223-25.031111h150.186666c15.928889 0 29.582222 11.377778 29.582223 25.031111 0 13.653333-13.653333 25.031111-29.582223 25.031111z m0 0M869.262222 546.133333H571.164444c-20.48 0-36.408889 15.928889-36.408888 36.408889v300.373334c0 20.48 15.928889 36.408889 36.408888 36.408888h298.097778c20.48 0 36.408889-15.928889 36.408889-36.408888V582.542222c0-20.48-15.928889-36.408889-36.408889-36.408889z m-75.093333 259.413334h-150.186667c-15.928889 0-29.582222-11.377778-29.582222-25.031111 0-13.653333 13.653333-25.031111 29.582222-25.031112h150.186667c15.928889 0 29.582222 11.377778 29.582222 25.031112 0 13.653333-13.653333 25.031111-29.582222 25.031111z m0-95.573334h-150.186667c-15.928889 0-29.582222-11.377778-29.582222-25.031111 0-13.653333 13.653333-25.031111 29.582222-25.031111h150.186667c15.928889 0 29.582222 11.377778 29.582222 25.031111 0 13.653333-13.653333 25.031111-29.582222 25.031111z m0 0" fill="#BFBFBF" p-id="10787"></path></svg>
|
After Width: | Height: | Size: 3.4 KiB |
1
ruoyi-ui/src/assets/icons/svg/lianjia.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597125922762" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="15530" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M552.362667 101.034667l406.954666 373.034666a34.133333 34.133333 0 0 1-23.04 59.306667L896 533.333333v298.666667a85.333333 85.333333 0 0 1-85.333333 85.333333H213.333333a85.333333 85.333333 0 0 1-85.333333-85.333333v-298.666667h-40.234667a34.133333 34.133333 0 0 1-23.04-59.264l406.912-373.034666a59.733333 59.733333 0 0 1 80.725334 0zM400.896 614.826667a34.901333 34.901333 0 0 0-49.237333 3.541333l-6.357334 7.978667a129.834667 129.834667 0 0 0-25.301333 77.056v46.677333c0 26.453333 21.504 48 48 48h288c26.496 0 48-21.504 48-48v-46.677333c0-30.549333-10.666667-59.349333-29.184-82.005334l-1.92-2.176-2.048-2.048a38.442667 38.442667 0 0 0-54.357333 2.688l-2.389334 2.602667a80.085333 80.085333 0 0 1-5.504 5.674667 152.96 152.96 0 0 1-96.597333 34.176 152.874667 152.874667 0 0 1-111.104-47.488zM512 353.194667a115.2 115.2 0 0 0-115.2 115.2v40.32a115.2 115.2 0 0 0 230.4 0v-40.32a115.2 115.2 0 0 0-115.2-115.2z" fill="#39A461" p-id="15531"></path></svg>
|
After Width: | Height: | Size: 1.3 KiB |
1
ruoyi-ui/src/assets/icons/svg/office.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597125223401" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6730" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M852.986802 59.256853v906.525888H169.973604V59.256853h683.013198M912.243655 0H111.756345v1024h800.48731V0z" p-id="6731" fill="#BFBFBF"></path><path d="M247.943147 132.028426h81.088325v81.088325h-81.088325zM397.64467 132.028426h81.088325v81.088325h-81.088325zM547.346193 132.028426h81.088325v81.088325h-81.088325zM697.047716 132.028426h81.088325v81.088325h-81.088325zM247.943147 280.690355h81.088325v81.088325h-81.088325zM397.64467 280.690355h81.088325v81.088325h-81.088325zM547.346193 280.690355h81.088325v81.088325h-81.088325zM697.047716 280.690355h81.088325v81.088325h-81.088325zM697.047716 726.676142h81.088325v81.088325h-81.088325zM247.943147 726.676142h81.088325v81.088325h-81.088325z" p-id="6732" fill="#BFBFBF"></path><path d="M395.565482 835.833503h231.829442v115.394923H395.565482z" fill="#BFBFBF" p-id="6733"></path><path d="M395.565482 806.724873h231.829442v164.255838H395.565482zM247.943147 429.352284h81.088325v81.088325h-81.088325zM397.64467 429.352284h81.088325v81.088325h-81.088325zM547.346193 429.352284h81.088325v81.088325h-81.088325zM697.047716 429.352284h81.088325v81.088325h-81.088325z" p-id="6734" fill="#BFBFBF"></path><path d="M247.943147 578.014213h81.088325v81.088325h-81.088325zM397.64467 578.014213h81.088325v81.088325h-81.088325zM547.346193 578.014213h81.088325v81.088325h-81.088325zM697.047716 578.014213h81.088325v81.088325h-81.088325z" p-id="6735" fill="#BFBFBF"></path></svg>
|
After Width: | Height: | Size: 1.7 KiB |
1
ruoyi-ui/src/assets/icons/svg/price.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597122406396" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4087" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M512 64C264.576 64 64 264.576 64 512c0 247.36 200.576 448 448 448 247.424 0 448-200.64 448-448C960 264.576 759.424 64 512 64zM689.728 478.464l0 94.656L564.48 573.12l0 32.832 125.248 0 0 94.784L564.48 700.736l0 91.008L471.168 791.744l0-91.008L349.44 700.736 349.44 605.952l121.728 0L471.168 573.12 349.44 573.12 349.44 478.464l71.104 0L301.312 258.688l107.712 0L512 448.256l102.912-189.568 107.776 0L603.456 478.464 689.728 478.464z" p-id="4088" fill="#BFBFBF"></path></svg>
|
After Width: | Height: | Size: 856 B |
1
ruoyi-ui/src/assets/icons/svg/rent.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597113553063" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2134" width="211.71875" height="200" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><style type="text/css"></style></defs><path d="M510.192941 1004.242824C238.411294 1003.941647 18.221176 783.721412 17.889882 512 18.221176 240.278588 238.441412 20.058353 510.192941 19.757176 781.884235 20.058353 1002.104471 240.278588 1002.405647 512c-0.301176 271.721412-220.521412 491.941647-492.242823 492.242824z m0-921.268706C273.257412 83.184941 81.317647 275.124706 81.046588 512c0.240941 236.845176 192.150588 428.815059 429.025883 429.086118 236.875294-0.271059 428.815059-192.210824 429.086117-429.086118-0.240941-236.845176-192.150588-428.784941-429.025882-429.025882z" fill="#BFBFBF" p-id="2135"></path><path d="M248.922353 602.112c32.858353-46.110118 60.114824-104.749176 81.859765-175.706353H251.512471V389.12h85.534117V306.296471c-22.016 1.746824-46.170353 3.523765-72.372706 5.210353a391.649882 391.649882 0 0 0-7.860706-38.309648c73.065412-4.216471 135.860706-9.999059 188.29553-17.317647l9.456941 39.845647c-20.992 2.108235-47.254588 4.577882-78.727529 7.318589v86.046117h82.944v37.225412h-82.944v70.896941l23.100235-20.419764a1181.515294 1181.515294 0 0 1 67.162353 71.318588l-29.906824 25.690353a877.206588 877.206588 0 0 0-60.355764-70.324706v241.904941h-38.79153v-234.496a570.036706 570.036706 0 0 1-69.812706 136.432941 1108.871529 1108.871529 0 0 0-18.311529-45.206588z m173.116235 83.998118h63.006118V262.234353h240.278588V686.08h45.116235v37.225412H422.038588v-37.225412zM525.854118 299.369412v103.905882h158.448941V299.369412h-158.448941z m0 244.495059h158.448941V440.018824h-158.448941v103.845647z m0 142.215529h158.448941v-105.472h-158.448941v105.472z" fill="#BFBFBF" p-id="2136"></path></svg>
|
After Width: | Height: | Size: 1.9 KiB |
1
ruoyi-ui/src/assets/icons/svg/residence.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597113735162" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4884" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128"><defs><style type="text/css"></style></defs><path d="M981.737401 435.219371L558.429727 18.925867a66.55781 66.55781 0 0 0-92.976141 0L407.2923 76.114385a38.091547 38.091547 0 0 0-14.489123-2.867105H186.01318A85.501187 85.501187 0 0 0 100.61439 158.748467v195.270375a38.142745 38.142745 0 0 0 5.119831 18.738584L42.145913 435.219371A65.021861 65.021861 0 0 0 27.400798 506.38503a65.789836 65.789836 0 0 0 61.437979 40.958652h20.991309v376.717206A100.041509 100.041509 0 0 0 209.564405 1024h604.754504a100.041509 100.041509 0 0 0 99.939112-99.939112V547.343682h20.991309a65.789836 65.789836 0 0 0 61.437979-40.958652 65.021861 65.021861 0 0 0-14.949908-71.165659zM511.941657 81.029424l396.172566 389.414388H115.769091zM177.51426 158.748467a8.601317 8.601317 0 0 1 8.49892-8.498921h145.966398L177.51426 302.10375z m358.797795 784.716583v-218.104825a1.279958 1.279958 0 0 1 1.126363-1.177561h84.784411a1.331156 1.331156 0 0 1 1.177561 1.177561v218.002428a1.331156 1.331156 0 0 1-1.177561 1.177561H537.540815a1.279958 1.279958 0 0 1-1.22876-1.177561z m301.097294-19.301765a23.346432 23.346432 0 0 1-23.09044 23.039242h-114.223442v-221.842302a78.179828 78.179828 0 0 0-78.077432-78.077431h-84.47722a78.12863 78.12863 0 0 0-78.026233 78.077431V947.10013H209.564405a23.346432 23.346432 0 0 1-23.09044-23.039242V547.343682h650.935384z" p-id="4885" fill="#BFBFBF"></path></svg>
|
After Width: | Height: | Size: 1.7 KiB |
1
ruoyi-ui/src/assets/icons/svg/sale.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597113679046" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4408" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M994.802 251.097v567.292c0 48.281-42.244 90.527-90.523 90.527H493.896c-18.105 0-30.175-12.07-30.175-30.178 0-36.209-30.176-66.383-66.385-66.383-36.211 0-72.422 30.174-72.422 66.383 0 18.107-12.069 30.178-30.174 30.178H119.725c-48.28 0-90.526-42.246-90.526-90.527V251.097c0-48.28 42.247-90.524 90.526-90.524h175.016c18.104 0 30.174 12.07 30.174 30.175 0 36.209 30.177 66.385 66.386 66.385 36.211 0 66.387-30.176 66.387-66.385 0-18.105 12.069-30.175 30.173-30.175h410.381c54.316 0 96.56 42.244 96.56 90.524zM524.07 848.564h380.208c18.105 0 30.174-12.068 30.174-30.176V251.097c0-18.105-12.068-30.175-30.174-30.175H524.07c-12.068 54.315-66.383 96.56-126.734 96.56-60.353 0-114.665-42.244-126.737-96.56H119.725c-18.105 0-30.176 12.07-30.176 30.175v567.292c0 18.107 12.071 30.176 30.176 30.176h150.874c12.072-54.314 66.385-96.561 126.737-96.561 60.351 0 108.629 42.246 126.734 96.56z" p-id="4409" fill="#BFBFBF"></path><path d="M158.602 617.545l25.5-30.601c15.9 14.7 36.9 24.601 56.4 24.601 23.1 0 35.4-9.9 35.4-25.5 0-16.501-13.5-21.601-33.3-30.001l-29.7-12.6c-22.5-9.301-45-27.301-45-59.701 0-36.3 31.8-64.2 76.801-64.2 25.8 0 51.601 10.2 69.601 28.5l-22.5 27.9c-14.1-11.7-28.8-18.3-47.1-18.3-19.5 0-32.101 8.7-32.101 23.399 0 15.9 15.9 21.601 34.8 29.101l29.101 12.301c27 11.1 44.7 28.2 44.7 60.3 0 36.301-30.3 67.201-81.601 67.201-29.7 0-59.401-11.7-81.001-32.4zM464.601 588.744H392.6L377 645.745h-45l71.101-222.002h52.2l71.4 222.002h-46.5l-15.6-57.001z m-9.6-34.5l-6.6-24.3c-6.9-23.101-12.9-48.601-19.5-72.602h-1.2c-5.7 24.301-12.3 49.501-18.9 72.602l-6.6 24.3h52.8zM552.797 423.743h44.4v184.802h90.002v37.2H552.797V423.743zM725.896 423.743h136.201v36.9h-91.801v51.3h78v37.201h-78v59.4h95.102v37.2H725.896V423.743z" p-id="4410" fill="#BFBFBF"></path></svg>
|
After Width: | Height: | Size: 2.1 KiB |
1
ruoyi-ui/src/assets/icons/svg/ultimate.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1597125499816" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="12329" xmlns:xlink="http://www.w3.org/1999/xlink" width="211.71875" height="200"><defs><style type="text/css"></style></defs><path d="M97.878 483.853c0-117.062-0.108-160.999-0.108-278.062 0-101.472 56.328-108.082 110.483-108.082h441.933c85.128 0 111.453 28.968 111.453 110.481v55.241c0 43.562-55.419 38.57-55.419 0V208.19c0-40.918-13.309-55.24-56.035-55.24H208.252c-45.746 0-55.241 6.203-55.241 55.24v552.407c0 30.278 16.572 55.241 55.241 55.241 67.004 0 43.482 0.026 110.484 0 33.77 0 36.252 55.241 0 55.241s-63.711 0.44-131.306 0.17c-39.867-0.163-72.883-23.774-84.643-60.322-3.292-10.223-4.694-21.525-4.694-32.34-0.323-116.658-0.215-178.076-0.215-294.734" fill="#BFBFBF" p-id="12330"></path><path d="M649.644 926.291c-152.344-0.027-275.666-123.537-275.666-276.122 0-152.586 123.915-276.259 276.529-276.042 152.616 0.215 275.884 124.022 275.722 276.878-0.16 152.236-123.807 275.314-276.585 275.286m0.756-496.868c-121.109-0.271-220.641 98.828-220.91 220.045-0.27 121.541 98.345 220.934 219.561 221.287 121.704 0.324 221.505-98.208 221.775-219.047 0.324-122.594-98.236-221.99-220.426-222.285M594.945 263.061c44.02 0.027 37.978 55.979 0 55.979h-331.45c-41.431 0-39.704-55.979 0-55.979 108.756-0.027 289.155-0.027 331.45 0zM318.736 428.782c44.021 0.028 37.979 55.98 0 55.98h-55.242c-41.431 0-39.704-55.98 0-55.98 108.757-0.027 12.948-0.027 55.242 0z" fill="#BFBFBF" p-id="12331"></path><path d="M785.502 547.22c-12.496-12.498-32.758-12.498-45.254 0L602.151 685.316l-42.191-42.191c-12.498-12.496-32.758-12.496-45.256 0-12.496 12.497-12.496 32.759 0 45.256l64.818 64.818c6.249 6.248 14.438 9.372 22.628 9.372s16.379-3.124 22.628-9.372a32.424 32.424 0 0 0 2.402-2.695 32.304 32.304 0 0 0 2.689-2.397l155.633-155.633c12.497-12.496 12.497-32.758 0-45.254z" fill="#BFBFBF" p-id="12332"></path></svg>
|
After Width: | Height: | Size: 2.0 KiB |
@ -1,71 +1,72 @@
|
|||||||
import Vue from 'vue'
|
import Vue from 'vue'
|
||||||
|
|
||||||
import Cookies from 'js-cookie'
|
import Cookies from 'js-cookie'
|
||||||
|
|
||||||
import 'normalize.css/normalize.css' // a modern alternative to CSS resets
|
import 'normalize.css/normalize.css' // a modern alternative to CSS resets
|
||||||
|
|
||||||
import Element from 'element-ui'
|
import Element from 'element-ui'
|
||||||
import './assets/styles/element-variables.scss'
|
import './assets/styles/element-variables.scss'
|
||||||
|
|
||||||
import '@/assets/styles/index.scss' // global css
|
import '@/assets/styles/index.scss' // global css
|
||||||
import '@/assets/styles/ruoyi.scss' // ruoyi css
|
import '@/assets/styles/ruoyi.scss' // ruoyi css
|
||||||
import App from './App'
|
import App from './App'
|
||||||
import store from './store'
|
import store from './store'
|
||||||
import router from './router'
|
import router from './router'
|
||||||
import permission from './directive/permission'
|
import permission from './directive/permission'
|
||||||
|
|
||||||
import './assets/icons' // icon
|
import './assets/icons' // icon
|
||||||
import './permission' // permission control
|
import './permission' // permission control
|
||||||
import { getDicts } from "@/api/system/dict/data";
|
import { getDicts } from "@/api/system/dict/data";
|
||||||
import { getConfigKey } from "@/api/system/config";
|
import { getConfigKey } from "@/api/system/config";
|
||||||
import { parseTime, resetForm, addDateRange, selectDictLabel, download, handleTree } from "@/utils/ruoyi";
|
import { parseTime, resetForm, addDateRange, selectDictLabel, download, handleTree,formatDate } from "@/utils/ruoyi";
|
||||||
import Pagination from "@/components/Pagination";
|
import Pagination from "@/components/Pagination";
|
||||||
|
|
||||||
// 全局方法挂载
|
// 全局方法挂载
|
||||||
Vue.prototype.getDicts = getDicts
|
Vue.prototype.getDicts = getDicts
|
||||||
Vue.prototype.getConfigKey = getConfigKey
|
Vue.prototype.getConfigKey = getConfigKey
|
||||||
Vue.prototype.parseTime = parseTime
|
Vue.prototype.parseTime = parseTime
|
||||||
Vue.prototype.resetForm = resetForm
|
Vue.prototype.formatDate = formatDate
|
||||||
Vue.prototype.addDateRange = addDateRange
|
Vue.prototype.resetForm = resetForm
|
||||||
Vue.prototype.selectDictLabel = selectDictLabel
|
Vue.prototype.addDateRange = addDateRange
|
||||||
Vue.prototype.download = download
|
Vue.prototype.selectDictLabel = selectDictLabel
|
||||||
Vue.prototype.handleTree = handleTree
|
Vue.prototype.download = download
|
||||||
|
Vue.prototype.handleTree = handleTree
|
||||||
Vue.prototype.msgSuccess = function (msg) {
|
|
||||||
this.$message({ showClose: true, message: msg, type: "success" });
|
Vue.prototype.msgSuccess = function (msg) {
|
||||||
}
|
this.$message({ showClose: true, message: msg, type: "success" });
|
||||||
|
}
|
||||||
Vue.prototype.msgError = function (msg) {
|
|
||||||
this.$message({ showClose: true, message: msg, type: "error" });
|
Vue.prototype.msgError = function (msg) {
|
||||||
}
|
this.$message({ showClose: true, message: msg, type: "error" });
|
||||||
|
}
|
||||||
Vue.prototype.msgInfo = function (msg) {
|
|
||||||
this.$message.info(msg);
|
Vue.prototype.msgInfo = function (msg) {
|
||||||
}
|
this.$message.info(msg);
|
||||||
|
}
|
||||||
// 全局组件挂载
|
|
||||||
Vue.component('Pagination', Pagination)
|
// 全局组件挂载
|
||||||
|
Vue.component('Pagination', Pagination)
|
||||||
Vue.use(permission)
|
|
||||||
|
Vue.use(permission)
|
||||||
/**
|
|
||||||
* If you don't want to use mock-server
|
/**
|
||||||
* you want to use MockJs for mock api
|
* If you don't want to use mock-server
|
||||||
* you can execute: mockXHR()
|
* you want to use MockJs for mock api
|
||||||
*
|
* you can execute: mockXHR()
|
||||||
* Currently MockJs will be used in the production environment,
|
*
|
||||||
* please remove it before going online! ! !
|
* Currently MockJs will be used in the production environment,
|
||||||
*/
|
* please remove it before going online! ! !
|
||||||
|
*/
|
||||||
Vue.use(Element, {
|
|
||||||
size: Cookies.get('size') || 'medium' // set element-ui default size
|
Vue.use(Element, {
|
||||||
})
|
size: Cookies.get('size') || 'medium' // set element-ui default size
|
||||||
|
})
|
||||||
Vue.config.productionTip = false
|
|
||||||
|
Vue.config.productionTip = false
|
||||||
new Vue({
|
|
||||||
el: '#app',
|
new Vue({
|
||||||
router,
|
el: '#app',
|
||||||
store,
|
router,
|
||||||
render: h => h(App)
|
store,
|
||||||
})
|
render: h => h(App)
|
||||||
|
})
|
||||||
|
@ -1,386 +1,371 @@
|
|||||||
/**
|
|
||||||
* 表格时间格式化
|
/**
|
||||||
*/
|
* @param {number} time
|
||||||
export function formatDate(cellValue) {
|
* @param {string} option
|
||||||
if (cellValue == null || cellValue == "") return "";
|
* @returns {string}
|
||||||
var date = new Date(cellValue)
|
*/
|
||||||
var year = date.getFullYear()
|
export function formatTime(time, option) {
|
||||||
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
|
if (('' + time).length === 10) {
|
||||||
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
|
time = parseInt(time) * 1000
|
||||||
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
|
} else {
|
||||||
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
|
time = +time
|
||||||
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
|
}
|
||||||
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
|
const d = new Date(time)
|
||||||
}
|
const now = Date.now()
|
||||||
|
|
||||||
/**
|
const diff = (now - d) / 1000
|
||||||
* @param {number} time
|
|
||||||
* @param {string} option
|
if (diff < 30) {
|
||||||
* @returns {string}
|
return '刚刚'
|
||||||
*/
|
} else if (diff < 3600) {
|
||||||
export function formatTime(time, option) {
|
// less 1 hour
|
||||||
if (('' + time).length === 10) {
|
return Math.ceil(diff / 60) + '分钟前'
|
||||||
time = parseInt(time) * 1000
|
} else if (diff < 3600 * 24) {
|
||||||
} else {
|
return Math.ceil(diff / 3600) + '小时前'
|
||||||
time = +time
|
} else if (diff < 3600 * 24 * 2) {
|
||||||
}
|
return '1天前'
|
||||||
const d = new Date(time)
|
}
|
||||||
const now = Date.now()
|
if (option) {
|
||||||
|
return parseTime(time, option)
|
||||||
const diff = (now - d) / 1000
|
} else {
|
||||||
|
return (
|
||||||
if (diff < 30) {
|
d.getMonth() +
|
||||||
return '刚刚'
|
1 +
|
||||||
} else if (diff < 3600) {
|
'月' +
|
||||||
// less 1 hour
|
d.getDate() +
|
||||||
return Math.ceil(diff / 60) + '分钟前'
|
'日' +
|
||||||
} else if (diff < 3600 * 24) {
|
d.getHours() +
|
||||||
return Math.ceil(diff / 3600) + '小时前'
|
'时' +
|
||||||
} else if (diff < 3600 * 24 * 2) {
|
d.getMinutes() +
|
||||||
return '1天前'
|
'分'
|
||||||
}
|
)
|
||||||
if (option) {
|
}
|
||||||
return parseTime(time, option)
|
}
|
||||||
} else {
|
|
||||||
return (
|
/**
|
||||||
d.getMonth() +
|
* @param {string} url
|
||||||
1 +
|
* @returns {Object}
|
||||||
'月' +
|
*/
|
||||||
d.getDate() +
|
export function getQueryObject(url) {
|
||||||
'日' +
|
url = url == null ? window.location.href : url
|
||||||
d.getHours() +
|
const search = url.substring(url.lastIndexOf('?') + 1)
|
||||||
'时' +
|
const obj = {}
|
||||||
d.getMinutes() +
|
const reg = /([^?&=]+)=([^?&=]*)/g
|
||||||
'分'
|
search.replace(reg, (rs, $1, $2) => {
|
||||||
)
|
const name = decodeURIComponent($1)
|
||||||
}
|
let val = decodeURIComponent($2)
|
||||||
}
|
val = String(val)
|
||||||
|
obj[name] = val
|
||||||
/**
|
return rs
|
||||||
* @param {string} url
|
})
|
||||||
* @returns {Object}
|
return obj
|
||||||
*/
|
}
|
||||||
export function getQueryObject(url) {
|
|
||||||
url = url == null ? window.location.href : url
|
/**
|
||||||
const search = url.substring(url.lastIndexOf('?') + 1)
|
* @param {string} input value
|
||||||
const obj = {}
|
* @returns {number} output value
|
||||||
const reg = /([^?&=]+)=([^?&=]*)/g
|
*/
|
||||||
search.replace(reg, (rs, $1, $2) => {
|
export function byteLength(str) {
|
||||||
const name = decodeURIComponent($1)
|
// returns the byte length of an utf8 string
|
||||||
let val = decodeURIComponent($2)
|
let s = str.length
|
||||||
val = String(val)
|
for (var i = str.length - 1; i >= 0; i--) {
|
||||||
obj[name] = val
|
const code = str.charCodeAt(i)
|
||||||
return rs
|
if (code > 0x7f && code <= 0x7ff) s++
|
||||||
})
|
else if (code > 0x7ff && code <= 0xffff) s += 2
|
||||||
return obj
|
if (code >= 0xDC00 && code <= 0xDFFF) i--
|
||||||
}
|
}
|
||||||
|
return s
|
||||||
/**
|
}
|
||||||
* @param {string} input value
|
|
||||||
* @returns {number} output value
|
/**
|
||||||
*/
|
* @param {Array} actual
|
||||||
export function byteLength(str) {
|
* @returns {Array}
|
||||||
// returns the byte length of an utf8 string
|
*/
|
||||||
let s = str.length
|
export function cleanArray(actual) {
|
||||||
for (var i = str.length - 1; i >= 0; i--) {
|
const newArray = []
|
||||||
const code = str.charCodeAt(i)
|
for (let i = 0; i < actual.length; i++) {
|
||||||
if (code > 0x7f && code <= 0x7ff) s++
|
if (actual[i]) {
|
||||||
else if (code > 0x7ff && code <= 0xffff) s += 2
|
newArray.push(actual[i])
|
||||||
if (code >= 0xDC00 && code <= 0xDFFF) i--
|
}
|
||||||
}
|
}
|
||||||
return s
|
return newArray
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Array} actual
|
* @param {Object} json
|
||||||
* @returns {Array}
|
* @returns {Array}
|
||||||
*/
|
*/
|
||||||
export function cleanArray(actual) {
|
export function param(json) {
|
||||||
const newArray = []
|
if (!json) return ''
|
||||||
for (let i = 0; i < actual.length; i++) {
|
return cleanArray(
|
||||||
if (actual[i]) {
|
Object.keys(json).map(key => {
|
||||||
newArray.push(actual[i])
|
if (json[key] === undefined) return ''
|
||||||
}
|
return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
|
||||||
}
|
})
|
||||||
return newArray
|
).join('&')
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {Object} json
|
* @param {string} url
|
||||||
* @returns {Array}
|
* @returns {Object}
|
||||||
*/
|
*/
|
||||||
export function param(json) {
|
export function param2Obj(url) {
|
||||||
if (!json) return ''
|
const search = url.split('?')[1]
|
||||||
return cleanArray(
|
if (!search) {
|
||||||
Object.keys(json).map(key => {
|
return {}
|
||||||
if (json[key] === undefined) return ''
|
}
|
||||||
return encodeURIComponent(key) + '=' + encodeURIComponent(json[key])
|
return JSON.parse(
|
||||||
})
|
'{"' +
|
||||||
).join('&')
|
decodeURIComponent(search)
|
||||||
}
|
.replace(/"/g, '\\"')
|
||||||
|
.replace(/&/g, '","')
|
||||||
/**
|
.replace(/=/g, '":"')
|
||||||
* @param {string} url
|
.replace(/\+/g, ' ') +
|
||||||
* @returns {Object}
|
'"}'
|
||||||
*/
|
)
|
||||||
export function param2Obj(url) {
|
}
|
||||||
const search = url.split('?')[1]
|
|
||||||
if (!search) {
|
/**
|
||||||
return {}
|
* @param {string} val
|
||||||
}
|
* @returns {string}
|
||||||
return JSON.parse(
|
*/
|
||||||
'{"' +
|
export function html2Text(val) {
|
||||||
decodeURIComponent(search)
|
const div = document.createElement('div')
|
||||||
.replace(/"/g, '\\"')
|
div.innerHTML = val
|
||||||
.replace(/&/g, '","')
|
return div.textContent || div.innerText
|
||||||
.replace(/=/g, '":"')
|
}
|
||||||
.replace(/\+/g, ' ') +
|
|
||||||
'"}'
|
/**
|
||||||
)
|
* Merges two objects, giving the last one precedence
|
||||||
}
|
* @param {Object} target
|
||||||
|
* @param {(Object|Array)} source
|
||||||
/**
|
* @returns {Object}
|
||||||
* @param {string} val
|
*/
|
||||||
* @returns {string}
|
export function objectMerge(target, source) {
|
||||||
*/
|
if (typeof target !== 'object') {
|
||||||
export function html2Text(val) {
|
target = {}
|
||||||
const div = document.createElement('div')
|
}
|
||||||
div.innerHTML = val
|
if (Array.isArray(source)) {
|
||||||
return div.textContent || div.innerText
|
return source.slice()
|
||||||
}
|
}
|
||||||
|
Object.keys(source).forEach(property => {
|
||||||
/**
|
const sourceProperty = source[property]
|
||||||
* Merges two objects, giving the last one precedence
|
if (typeof sourceProperty === 'object') {
|
||||||
* @param {Object} target
|
target[property] = objectMerge(target[property], sourceProperty)
|
||||||
* @param {(Object|Array)} source
|
} else {
|
||||||
* @returns {Object}
|
target[property] = sourceProperty
|
||||||
*/
|
}
|
||||||
export function objectMerge(target, source) {
|
})
|
||||||
if (typeof target !== 'object') {
|
return target
|
||||||
target = {}
|
}
|
||||||
}
|
|
||||||
if (Array.isArray(source)) {
|
/**
|
||||||
return source.slice()
|
* @param {HTMLElement} element
|
||||||
}
|
* @param {string} className
|
||||||
Object.keys(source).forEach(property => {
|
*/
|
||||||
const sourceProperty = source[property]
|
export function toggleClass(element, className) {
|
||||||
if (typeof sourceProperty === 'object') {
|
if (!element || !className) {
|
||||||
target[property] = objectMerge(target[property], sourceProperty)
|
return
|
||||||
} else {
|
}
|
||||||
target[property] = sourceProperty
|
let classString = element.className
|
||||||
}
|
const nameIndex = classString.indexOf(className)
|
||||||
})
|
if (nameIndex === -1) {
|
||||||
return target
|
classString += '' + className
|
||||||
}
|
} else {
|
||||||
|
classString =
|
||||||
/**
|
classString.substr(0, nameIndex) +
|
||||||
* @param {HTMLElement} element
|
classString.substr(nameIndex + className.length)
|
||||||
* @param {string} className
|
}
|
||||||
*/
|
element.className = classString
|
||||||
export function toggleClass(element, className) {
|
}
|
||||||
if (!element || !className) {
|
|
||||||
return
|
/**
|
||||||
}
|
* @param {string} type
|
||||||
let classString = element.className
|
* @returns {Date}
|
||||||
const nameIndex = classString.indexOf(className)
|
*/
|
||||||
if (nameIndex === -1) {
|
export function getTime(type) {
|
||||||
classString += '' + className
|
if (type === 'start') {
|
||||||
} else {
|
return new Date().getTime() - 3600 * 1000 * 24 * 90
|
||||||
classString =
|
} else {
|
||||||
classString.substr(0, nameIndex) +
|
return new Date(new Date().toDateString())
|
||||||
classString.substr(nameIndex + className.length)
|
}
|
||||||
}
|
}
|
||||||
element.className = classString
|
|
||||||
}
|
/**
|
||||||
|
* @param {Function} func
|
||||||
/**
|
* @param {number} wait
|
||||||
* @param {string} type
|
* @param {boolean} immediate
|
||||||
* @returns {Date}
|
* @return {*}
|
||||||
*/
|
*/
|
||||||
export function getTime(type) {
|
export function debounce(func, wait, immediate) {
|
||||||
if (type === 'start') {
|
let timeout, args, context, timestamp, result
|
||||||
return new Date().getTime() - 3600 * 1000 * 24 * 90
|
|
||||||
} else {
|
const later = function () {
|
||||||
return new Date(new Date().toDateString())
|
// 据上一次触发时间间隔
|
||||||
}
|
const last = +new Date() - timestamp
|
||||||
}
|
|
||||||
|
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
|
||||||
/**
|
if (last < wait && last > 0) {
|
||||||
* @param {Function} func
|
timeout = setTimeout(later, wait - last)
|
||||||
* @param {number} wait
|
} else {
|
||||||
* @param {boolean} immediate
|
timeout = null
|
||||||
* @return {*}
|
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
|
||||||
*/
|
if (!immediate) {
|
||||||
export function debounce(func, wait, immediate) {
|
result = func.apply(context, args)
|
||||||
let timeout, args, context, timestamp, result
|
if (!timeout) context = args = null
|
||||||
|
}
|
||||||
const later = function() {
|
}
|
||||||
// 据上一次触发时间间隔
|
}
|
||||||
const last = +new Date() - timestamp
|
|
||||||
|
return function (...args) {
|
||||||
// 上次被包装函数被调用时间间隔 last 小于设定时间间隔 wait
|
context = this
|
||||||
if (last < wait && last > 0) {
|
timestamp = +new Date()
|
||||||
timeout = setTimeout(later, wait - last)
|
const callNow = immediate && !timeout
|
||||||
} else {
|
// 如果延时不存在,重新设定延时
|
||||||
timeout = null
|
if (!timeout) timeout = setTimeout(later, wait)
|
||||||
// 如果设定为immediate===true,因为开始边界已经调用过了此处无需调用
|
if (callNow) {
|
||||||
if (!immediate) {
|
result = func.apply(context, args)
|
||||||
result = func.apply(context, args)
|
context = args = null
|
||||||
if (!timeout) context = args = null
|
}
|
||||||
}
|
|
||||||
}
|
return result
|
||||||
}
|
}
|
||||||
|
}
|
||||||
return function(...args) {
|
|
||||||
context = this
|
/**
|
||||||
timestamp = +new Date()
|
* This is just a simple version of deep copy
|
||||||
const callNow = immediate && !timeout
|
* Has a lot of edge cases bug
|
||||||
// 如果延时不存在,重新设定延时
|
* If you want to use a perfect deep copy, use lodash's _.cloneDeep
|
||||||
if (!timeout) timeout = setTimeout(later, wait)
|
* @param {Object} source
|
||||||
if (callNow) {
|
* @returns {Object}
|
||||||
result = func.apply(context, args)
|
*/
|
||||||
context = args = null
|
export function deepClone(source) {
|
||||||
}
|
if (!source && typeof source !== 'object') {
|
||||||
|
throw new Error('error arguments', 'deepClone')
|
||||||
return result
|
}
|
||||||
}
|
const targetObj = source.constructor === Array ? [] : {}
|
||||||
}
|
Object.keys(source).forEach(keys => {
|
||||||
|
if (source[keys] && typeof source[keys] === 'object') {
|
||||||
/**
|
targetObj[keys] = deepClone(source[keys])
|
||||||
* This is just a simple version of deep copy
|
} else {
|
||||||
* Has a lot of edge cases bug
|
targetObj[keys] = source[keys]
|
||||||
* If you want to use a perfect deep copy, use lodash's _.cloneDeep
|
}
|
||||||
* @param {Object} source
|
})
|
||||||
* @returns {Object}
|
return targetObj
|
||||||
*/
|
}
|
||||||
export function deepClone(source) {
|
|
||||||
if (!source && typeof source !== 'object') {
|
/**
|
||||||
throw new Error('error arguments', 'deepClone')
|
* @param {Array} arr
|
||||||
}
|
* @returns {Array}
|
||||||
const targetObj = source.constructor === Array ? [] : {}
|
*/
|
||||||
Object.keys(source).forEach(keys => {
|
export function uniqueArr(arr) {
|
||||||
if (source[keys] && typeof source[keys] === 'object') {
|
return Array.from(new Set(arr))
|
||||||
targetObj[keys] = deepClone(source[keys])
|
}
|
||||||
} else {
|
|
||||||
targetObj[keys] = source[keys]
|
/**
|
||||||
}
|
* @returns {string}
|
||||||
})
|
*/
|
||||||
return targetObj
|
export function createUniqueString() {
|
||||||
}
|
const timestamp = +new Date() + ''
|
||||||
|
const randomNum = parseInt((1 + Math.random()) * 65536) + ''
|
||||||
/**
|
return (+(randomNum + timestamp)).toString(32)
|
||||||
* @param {Array} arr
|
}
|
||||||
* @returns {Array}
|
|
||||||
*/
|
/**
|
||||||
export function uniqueArr(arr) {
|
* Check if an element has a class
|
||||||
return Array.from(new Set(arr))
|
* @param {HTMLElement} elm
|
||||||
}
|
* @param {string} cls
|
||||||
|
* @returns {boolean}
|
||||||
/**
|
*/
|
||||||
* @returns {string}
|
export function hasClass(ele, cls) {
|
||||||
*/
|
return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
|
||||||
export function createUniqueString() {
|
}
|
||||||
const timestamp = +new Date() + ''
|
|
||||||
const randomNum = parseInt((1 + Math.random()) * 65536) + ''
|
/**
|
||||||
return (+(randomNum + timestamp)).toString(32)
|
* Add class to element
|
||||||
}
|
* @param {HTMLElement} elm
|
||||||
|
* @param {string} cls
|
||||||
/**
|
*/
|
||||||
* Check if an element has a class
|
export function addClass(ele, cls) {
|
||||||
* @param {HTMLElement} elm
|
if (!hasClass(ele, cls)) ele.className += ' ' + cls
|
||||||
* @param {string} cls
|
}
|
||||||
* @returns {boolean}
|
|
||||||
*/
|
/**
|
||||||
export function hasClass(ele, cls) {
|
* Remove class from element
|
||||||
return !!ele.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)'))
|
* @param {HTMLElement} elm
|
||||||
}
|
* @param {string} cls
|
||||||
|
*/
|
||||||
/**
|
export function removeClass(ele, cls) {
|
||||||
* Add class to element
|
if (hasClass(ele, cls)) {
|
||||||
* @param {HTMLElement} elm
|
const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
|
||||||
* @param {string} cls
|
ele.className = ele.className.replace(reg, ' ')
|
||||||
*/
|
}
|
||||||
export function addClass(ele, cls) {
|
}
|
||||||
if (!hasClass(ele, cls)) ele.className += ' ' + cls
|
|
||||||
}
|
export function makeMap(str, expectsLowerCase) {
|
||||||
|
const map = Object.create(null)
|
||||||
/**
|
const list = str.split(',')
|
||||||
* Remove class from element
|
for (let i = 0; i < list.length; i++) {
|
||||||
* @param {HTMLElement} elm
|
map[list[i]] = true
|
||||||
* @param {string} cls
|
}
|
||||||
*/
|
return expectsLowerCase
|
||||||
export function removeClass(ele, cls) {
|
? val => map[val.toLowerCase()]
|
||||||
if (hasClass(ele, cls)) {
|
: val => map[val]
|
||||||
const reg = new RegExp('(\\s|^)' + cls + '(\\s|$)')
|
}
|
||||||
ele.className = ele.className.replace(reg, ' ')
|
|
||||||
}
|
export const exportDefault = 'export default '
|
||||||
}
|
|
||||||
|
export const beautifierConf = {
|
||||||
export function makeMap(str, expectsLowerCase) {
|
html: {
|
||||||
const map = Object.create(null)
|
indent_size: '2',
|
||||||
const list = str.split(',')
|
indent_char: ' ',
|
||||||
for (let i = 0; i < list.length; i++) {
|
max_preserve_newlines: '-1',
|
||||||
map[list[i]] = true
|
preserve_newlines: false,
|
||||||
}
|
keep_array_indentation: false,
|
||||||
return expectsLowerCase
|
break_chained_methods: false,
|
||||||
? val => map[val.toLowerCase()]
|
indent_scripts: 'separate',
|
||||||
: val => map[val]
|
brace_style: 'end-expand',
|
||||||
}
|
space_before_conditional: true,
|
||||||
|
unescape_strings: false,
|
||||||
export const exportDefault = 'export default '
|
jslint_happy: false,
|
||||||
|
end_with_newline: true,
|
||||||
export const beautifierConf = {
|
wrap_line_length: '110',
|
||||||
html: {
|
indent_inner_html: true,
|
||||||
indent_size: '2',
|
comma_first: false,
|
||||||
indent_char: ' ',
|
e4x: true,
|
||||||
max_preserve_newlines: '-1',
|
indent_empty_lines: true
|
||||||
preserve_newlines: false,
|
},
|
||||||
keep_array_indentation: false,
|
js: {
|
||||||
break_chained_methods: false,
|
indent_size: '2',
|
||||||
indent_scripts: 'separate',
|
indent_char: ' ',
|
||||||
brace_style: 'end-expand',
|
max_preserve_newlines: '-1',
|
||||||
space_before_conditional: true,
|
preserve_newlines: false,
|
||||||
unescape_strings: false,
|
keep_array_indentation: false,
|
||||||
jslint_happy: false,
|
break_chained_methods: false,
|
||||||
end_with_newline: true,
|
indent_scripts: 'normal',
|
||||||
wrap_line_length: '110',
|
brace_style: 'end-expand',
|
||||||
indent_inner_html: true,
|
space_before_conditional: true,
|
||||||
comma_first: false,
|
unescape_strings: false,
|
||||||
e4x: true,
|
jslint_happy: true,
|
||||||
indent_empty_lines: true
|
end_with_newline: true,
|
||||||
},
|
wrap_line_length: '110',
|
||||||
js: {
|
indent_inner_html: true,
|
||||||
indent_size: '2',
|
comma_first: false,
|
||||||
indent_char: ' ',
|
e4x: true,
|
||||||
max_preserve_newlines: '-1',
|
indent_empty_lines: true
|
||||||
preserve_newlines: false,
|
}
|
||||||
keep_array_indentation: false,
|
}
|
||||||
break_chained_methods: false,
|
|
||||||
indent_scripts: 'normal',
|
// 首字母大小
|
||||||
brace_style: 'end-expand',
|
export function titleCase(str) {
|
||||||
space_before_conditional: true,
|
return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
|
||||||
unescape_strings: false,
|
}
|
||||||
jslint_happy: true,
|
|
||||||
end_with_newline: true,
|
// 下划转驼峰
|
||||||
wrap_line_length: '110',
|
export function camelCase(str) {
|
||||||
indent_inner_html: true,
|
return str.replace(/-[a-z]/g, str1 => str1.substr(-1).toUpperCase())
|
||||||
comma_first: false,
|
}
|
||||||
e4x: true,
|
|
||||||
indent_empty_lines: true
|
export function isNumberStr(str) {
|
||||||
}
|
return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 首字母大小
|
|
||||||
export function titleCase(str) {
|
|
||||||
return str.replace(/( |^)[a-z]/g, L => L.toUpperCase())
|
|
||||||
}
|
|
||||||
|
|
||||||
// 下划转驼峰
|
|
||||||
export function camelCase(str) {
|
|
||||||
return str.replace(/-[a-z]/g, str1 => str1.substr(-1).toUpperCase())
|
|
||||||
}
|
|
||||||
|
|
||||||
export function isNumberStr(str) {
|
|
||||||
return /^[+-]?(0|([1-9]\d*))(\.\d+)?$/g.test(str)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
@ -1,134 +1,155 @@
|
|||||||
/**
|
/**
|
||||||
* 通用js方法封装处理
|
* 通用js方法封装处理
|
||||||
* Copyright (c) 2019 ruoyi
|
* Copyright (c) 2019 ruoyi
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const baseURL = process.env.VUE_APP_BASE_API
|
const baseURL = process.env.VUE_APP_BASE_API
|
||||||
|
|
||||||
// 日期格式化
|
/**
|
||||||
export function parseTime(time, pattern) {
|
* 表格时间格式化
|
||||||
if (arguments.length === 0 || !time) {
|
*/
|
||||||
return null
|
export function formatDate(cellValue) {
|
||||||
}
|
if (cellValue == null || cellValue == "") return "";
|
||||||
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
|
if (typeof cellValue === 'string') {
|
||||||
let date
|
if (cellValue) {
|
||||||
if (typeof time === 'object') {
|
return cellValue.substring(0, 10);
|
||||||
date = time
|
}
|
||||||
} else {
|
return;
|
||||||
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
|
}
|
||||||
time = parseInt(time)
|
var date = new Date(cellValue)
|
||||||
} else if (typeof time === 'string') {
|
var year = date.getFullYear()
|
||||||
time = time.replace(new RegExp(/-/gm), '/');
|
var month = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1
|
||||||
}
|
var day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
|
||||||
if ((typeof time === 'number') && (time.toString().length === 10)) {
|
var hours = date.getHours() < 10 ? '0' + date.getHours() : date.getHours()
|
||||||
time = time * 1000
|
var minutes = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
|
||||||
}
|
var seconds = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
|
||||||
date = new Date(time)
|
return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds
|
||||||
}
|
}
|
||||||
const formatObj = {
|
|
||||||
y: date.getFullYear(),
|
|
||||||
m: date.getMonth() + 1,
|
// 日期格式化
|
||||||
d: date.getDate(),
|
export function parseTime(time, pattern) {
|
||||||
h: date.getHours(),
|
if (arguments.length === 0 || !time) {
|
||||||
i: date.getMinutes(),
|
return null
|
||||||
s: date.getSeconds(),
|
}
|
||||||
a: date.getDay()
|
const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
|
||||||
}
|
let date
|
||||||
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
|
if (typeof time === 'object') {
|
||||||
let value = formatObj[key]
|
date = time
|
||||||
// Note: getDay() returns 0 on Sunday
|
} else {
|
||||||
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
|
if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
|
||||||
if (result.length > 0 && value < 10) {
|
time = parseInt(time)
|
||||||
value = '0' + value
|
} else if (typeof time === 'string') {
|
||||||
}
|
time = time.replace(new RegExp(/-/gm), '/');
|
||||||
return value || 0
|
}
|
||||||
})
|
if ((typeof time === 'number') && (time.toString().length === 10)) {
|
||||||
return time_str
|
time = time * 1000
|
||||||
}
|
}
|
||||||
|
date = new Date(time)
|
||||||
// 表单重置
|
}
|
||||||
export function resetForm(refName) {
|
const formatObj = {
|
||||||
if (this.$refs[refName]) {
|
y: date.getFullYear(),
|
||||||
this.$refs[refName].resetFields();
|
m: date.getMonth() + 1,
|
||||||
}
|
d: date.getDate(),
|
||||||
}
|
h: date.getHours(),
|
||||||
|
i: date.getMinutes(),
|
||||||
// 添加日期范围
|
s: date.getSeconds(),
|
||||||
export function addDateRange(params, dateRange) {
|
a: date.getDay()
|
||||||
var search = params;
|
}
|
||||||
search.beginTime = "";
|
const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
|
||||||
search.endTime = "";
|
let value = formatObj[key]
|
||||||
if (null != dateRange && '' != dateRange) {
|
// Note: getDay() returns 0 on Sunday
|
||||||
search.beginTime = this.dateRange[0];
|
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
|
||||||
search.endTime = this.dateRange[1];
|
if (result.length > 0 && value < 10) {
|
||||||
}
|
value = '0' + value
|
||||||
return search;
|
}
|
||||||
}
|
return value || 0
|
||||||
|
})
|
||||||
// 回显数据字典
|
return time_str
|
||||||
export function selectDictLabel(datas, value) {
|
}
|
||||||
var actions = [];
|
|
||||||
Object.keys(datas).map((key) => {
|
// 表单重置
|
||||||
if (datas[key].dictValue == ('' + value)) {
|
export function resetForm(refName) {
|
||||||
actions.push(datas[key].dictLabel);
|
if (this.$refs[refName]) {
|
||||||
return false;
|
this.$refs[refName].resetFields();
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
return actions.join('');
|
|
||||||
}
|
// 添加日期范围
|
||||||
|
export function addDateRange(params, dateRange) {
|
||||||
// 通用下载方法
|
var search = params;
|
||||||
export function download(fileName) {
|
search.beginTime = "";
|
||||||
window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true;
|
search.endTime = "";
|
||||||
}
|
if (null != dateRange && '' != dateRange) {
|
||||||
|
search.beginTime = this.dateRange[0];
|
||||||
// 字符串格式化(%s )
|
search.endTime = this.dateRange[1];
|
||||||
export function sprintf(str) {
|
}
|
||||||
var args = arguments, flag = true, i = 1;
|
return search;
|
||||||
str = str.replace(/%s/g, function () {
|
}
|
||||||
var arg = args[i++];
|
|
||||||
if (typeof arg === 'undefined') {
|
// 回显数据字典
|
||||||
flag = false;
|
export function selectDictLabel(datas, value) {
|
||||||
return '';
|
var actions = [];
|
||||||
}
|
Object.keys(datas).map((key) => {
|
||||||
return arg;
|
if (datas[key].dictValue == ('' + value)) {
|
||||||
});
|
actions.push(datas[key].dictLabel);
|
||||||
return flag ? str : '';
|
return false;
|
||||||
}
|
}
|
||||||
|
})
|
||||||
// 转换字符串,undefined,null等转化为""
|
return actions.join('');
|
||||||
export function praseStrEmpty(str) {
|
}
|
||||||
if (!str || str == "undefined" || str == "null") {
|
|
||||||
return "";
|
// 通用下载方法
|
||||||
}
|
export function download(fileName) {
|
||||||
return str;
|
window.location.href = baseURL + "/common/download?fileName=" + encodeURI(fileName) + "&delete=" + true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// 字符串格式化(%s )
|
||||||
* 构造树型结构数据
|
export function sprintf(str) {
|
||||||
* @param {*} data 数据源
|
var args = arguments, flag = true, i = 1;
|
||||||
* @param {*} id id字段 默认 'id'
|
str = str.replace(/%s/g, function () {
|
||||||
* @param {*} parentId 父节点字段 默认 'parentId'
|
var arg = args[i++];
|
||||||
* @param {*} children 孩子节点字段 默认 'children'
|
if (typeof arg === 'undefined') {
|
||||||
* @param {*} rootId 根Id 默认 0
|
flag = false;
|
||||||
*/
|
return '';
|
||||||
export function handleTree(data, id, parentId, children, rootId) {
|
}
|
||||||
id = id || 'id'
|
return arg;
|
||||||
parentId = parentId || 'parentId'
|
});
|
||||||
children = children || 'children'
|
return flag ? str : '';
|
||||||
rootId = rootId || 0
|
}
|
||||||
//对源数据深度克隆
|
|
||||||
const cloneData = JSON.parse(JSON.stringify(data))
|
// 转换字符串,undefined,null等转化为""
|
||||||
//循环所有项
|
export function praseStrEmpty(str) {
|
||||||
const treeData = cloneData.filter(father => {
|
if (!str || str == "undefined" || str == "null") {
|
||||||
let branchArr = cloneData.filter(child => {
|
return "";
|
||||||
//返回每一项的子级数组
|
}
|
||||||
return father[id] === child[parentId]
|
return str;
|
||||||
});
|
}
|
||||||
branchArr.length > 0 ? father.children = branchArr : '';
|
|
||||||
//返回第一层
|
/**
|
||||||
return father[parentId] === rootId;
|
* 构造树型结构数据
|
||||||
});
|
* @param {*} data 数据源
|
||||||
return treeData != '' ? treeData : data;
|
* @param {*} id id字段 默认 'id'
|
||||||
}
|
* @param {*} parentId 父节点字段 默认 'parentId'
|
||||||
|
* @param {*} children 孩子节点字段 默认 'children'
|
||||||
|
* @param {*} rootId 根Id 默认 0
|
||||||
|
*/
|
||||||
|
export function handleTree(data, id, parentId, children, rootId) {
|
||||||
|
id = id || 'id'
|
||||||
|
parentId = parentId || 'parentId'
|
||||||
|
children = children || 'children'
|
||||||
|
rootId = rootId || 0
|
||||||
|
//对源数据深度克隆
|
||||||
|
const cloneData = JSON.parse(JSON.stringify(data))
|
||||||
|
//循环所有项
|
||||||
|
const treeData = cloneData.filter(father => {
|
||||||
|
let branchArr = cloneData.filter(child => {
|
||||||
|
//返回每一项的子级数组
|
||||||
|
return father[id] === child[parentId]
|
||||||
|
});
|
||||||
|
branchArr.length > 0 ? father.children = branchArr : '';
|
||||||
|
//返回第一层
|
||||||
|
return father[parentId] === rootId;
|
||||||
|
});
|
||||||
|
return treeData != '' ? treeData : data;
|
||||||
|
}
|
||||||
|
298
ruoyi-ui/src/views/data/cases/AggregateResidenceRentCase.vue
Normal file
@ -0,0 +1,298 @@
|
|||||||
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-form :model="queryParams" :rules="rules" ref="queryForm" :inline="true" label-width="100px">
|
||||||
|
<el-form-item label="年月" prop="yearMonth">
|
||||||
|
<el-select v-model="queryParams.yearMonth" placeholder="请选择年月">
|
||||||
|
<el-option
|
||||||
|
v-for="item in yearMonthList"
|
||||||
|
:value="item.value"
|
||||||
|
:label="item.label"
|
||||||
|
:key="item.value"
|
||||||
|
></el-option>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="案例名称" prop="caseName" clearable>
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.caseName"
|
||||||
|
placeholder="请输入案例名称"
|
||||||
|
clearable
|
||||||
|
size="small"
|
||||||
|
@keyup.enter.native="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||||
|
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
|
<el-row :gutter="10" class="mb8">
|
||||||
|
<el-col :span="1.5">
|
||||||
|
<el-button
|
||||||
|
type="warning"
|
||||||
|
icon="el-icon-download"
|
||||||
|
size="mini"
|
||||||
|
@click="handleExport"
|
||||||
|
v-hasPermi="['system:user:export']"
|
||||||
|
>导出</el-button>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
|
<el-table v-loading="loading" :data="dataList">
|
||||||
|
<!-- <el-table-column label="年月" align="center" prop="yearMonth" /> -->
|
||||||
|
<el-table-column label="案例URL" align="center" prop="urlHouseholds" width="300">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<a
|
||||||
|
:href="scope.row.urlHouseholds"
|
||||||
|
target="_blank"
|
||||||
|
v-bind:style="'color: blue;'"
|
||||||
|
>{{scope.row.urlHouseholds}}</a>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="案例名称" align="center" prop="caseName" width="240" />
|
||||||
|
<el-table-column label="案例来源" align="center" prop="origin" />
|
||||||
|
<el-table-column label="挂牌/成交" align="center" prop="caseType" :formatter="caseTypeFormatter" />
|
||||||
|
<el-table-column label="案例单套ID" align="center" prop="householdsIdSRC" width="120" />
|
||||||
|
<el-table-column label="案例小区ID" align="center" prop="projectIdSRC" />
|
||||||
|
<el-table-column label="小区ID" align="center" prop="communityId" />
|
||||||
|
<el-table-column label="楼栋ID" align="center" prop="buildingId" />
|
||||||
|
<el-table-column label="租赁类型" align="center" :formatter="rentTypeFormatter" />
|
||||||
|
<el-table-column label="室-厅-卫">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.roomNum+'-'+scope.row.hallNum+'-'+(scope.row.bashRoomNum?scope.row.bashRoomNum:0) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="面积" align="center" prop="area" />
|
||||||
|
<el-table-column label="朝向" align="center" prop="toward" />
|
||||||
|
<el-table-column label="所在层/总楼层" align="center">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ scope.row.currentFloor+'/'+scope.row.totalFloor }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="有无电梯" align="center" prop="elevator" :formatter="youOrWuFormatter" />
|
||||||
|
<el-table-column label="装修类型" align="center" prop="decoration" />
|
||||||
|
<el-table-column label="建成年代" align="center" prop="year" />
|
||||||
|
<el-table-column label="房屋面积系数" align="center" prop="areaCoefficient" />
|
||||||
|
<el-table-column label="朝向系数" align="center" prop="towardCoefficient" />
|
||||||
|
<el-table-column label="楼层系数" align="center" prop="floorCoefficient" />
|
||||||
|
<el-table-column label="装修系数" align="center" prop="decorationCoefficient" />
|
||||||
|
<el-table-column label="建成年代系数" align="center" prop="yearCoefficient" />
|
||||||
|
<el-table-column label="楼栋系数" align="center" prop="buildingCoefficient" />
|
||||||
|
<el-table-column label="室厅修正系数" align="center" prop="roomTypeCoefficient" />
|
||||||
|
<el-table-column label="总价(元)" align="center" prop="totalPrice" />
|
||||||
|
<el-table-column label="单价" align="center" prop="unitPrice" />
|
||||||
|
<el-table-column label="散租单价" align="center" prop="priceScatterRent" />
|
||||||
|
<el-table-column label="整租单价" align="center" prop="priceEntireRent" />
|
||||||
|
<el-table-column label="合租折算价" align="center" prop="priceShareRent" />
|
||||||
|
<el-table-column label="带看总次数" align="center" prop="visitedNum" />
|
||||||
|
<el-table-column label="首次带看时间" align="center" prop="firstVisitedDate" />
|
||||||
|
<el-table-column label="15天内带看总次数" align="center" prop="visitedNum15" />
|
||||||
|
<el-table-column label="30天内带看总次数" align="center" prop="visitedNum30" />
|
||||||
|
<el-table-column label="案例状态" align="center" prop="status" :formatter="statusFormatter" />
|
||||||
|
<el-table-column label="最近一次挂牌总价调整幅度" align="center" prop="adjustedValue" />
|
||||||
|
<el-table-column label="最近一次挂牌总价调整比例" align="center" prop="adjustedPst" />
|
||||||
|
<el-table-column label="累计挂牌总价调整幅度" align="center" prop="adjustedCumValue" />
|
||||||
|
<el-table-column label="累计挂牌总价调整比例" align="center" prop="adjustedCumPst" />
|
||||||
|
<el-table-column label="累计挂牌总价绝对调整幅度" align="center" prop="adjustedCumValueAbs" />
|
||||||
|
<el-table-column label="累计挂牌总价绝对调整比例" align="center" prop="adjustedCumPstAbs" />
|
||||||
|
<el-table-column label="累计挂牌总价调价次数" align="center" prop="adjustedCumNum" />
|
||||||
|
<el-table-column label="首次挂牌总价" align="center" prop="priceTotalIn" />
|
||||||
|
<el-table-column label="下架时挂牌总价" align="center" prop="priceTotalOut" />
|
||||||
|
<el-table-column label="首次挂牌日期" align="center" width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ formatDate(scope.row.priceDateIn) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="下架日期" align="center" width="120">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<span>{{ formatDate(scope.row.priceDateOut) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="案例小区URL" align="center" width="400">
|
||||||
|
<template slot-scope="scope">
|
||||||
|
<a :href="scope.row.urlProjects" target="_blank">{{scope.row.urlProjects}}</a>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="平均租金(上周期)" align="center" prop="rentPrice_1" />
|
||||||
|
<el-table-column label="案例涨跌幅" align="center" prop="range" />
|
||||||
|
<el-table-column label="涨跌类型" align="center" prop="rangeFlag" />
|
||||||
|
<el-table-column label="平均租金" align="center" prop="rentPrice" />
|
||||||
|
<el-table-column label="整租比" align="center" prop="entireRentRatio" />
|
||||||
|
<el-table-column label="分租比" align="center" prop="shareRentRatio" />
|
||||||
|
</el-table>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="total>0"
|
||||||
|
:total="total"
|
||||||
|
:page.sync="queryParams.pageIndex"
|
||||||
|
:limit.sync="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { getToken } from "@/utils/auth";
|
||||||
|
import {
|
||||||
|
list,
|
||||||
|
export2File,
|
||||||
|
getYearMonthList
|
||||||
|
} from "@/api/data/aggregateResidenceRentCase";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "aggregateResidenceRentCase",
|
||||||
|
data() {
|
||||||
|
// 年月
|
||||||
|
var checkYearMonth = (rule, value, callback) => {
|
||||||
|
if (!value) {
|
||||||
|
callback(new Error("请输入年月"));
|
||||||
|
} else if (value === "" || isNaN(parseInt(value))) {
|
||||||
|
callback(new Error("请输入年月"));
|
||||||
|
} else {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return {
|
||||||
|
// 遮罩层
|
||||||
|
loading: true,
|
||||||
|
// 选中数组
|
||||||
|
ids: [],
|
||||||
|
// 非单个禁用
|
||||||
|
single: true,
|
||||||
|
// 非多个禁用
|
||||||
|
multiple: true,
|
||||||
|
// 总条数
|
||||||
|
total: 0,
|
||||||
|
// 办公基价表格数据
|
||||||
|
dataList: [],
|
||||||
|
// 弹出层标题
|
||||||
|
title: "",
|
||||||
|
// 是否显示弹出层
|
||||||
|
open: false,
|
||||||
|
// 查询参数
|
||||||
|
queryParams: {
|
||||||
|
yearMonth: undefined,
|
||||||
|
caseName: undefined,
|
||||||
|
pageIndex: 1,
|
||||||
|
pageSize: 10
|
||||||
|
},
|
||||||
|
yearMonthList: [],
|
||||||
|
statusOptions: [
|
||||||
|
{ value: 1, text: "正常" },
|
||||||
|
{ value: 1, text: "失效" }
|
||||||
|
],
|
||||||
|
upload: {
|
||||||
|
// 是否显示弹出层(用户导入)
|
||||||
|
open: false,
|
||||||
|
// 弹出层标题(用户导入)
|
||||||
|
title: "",
|
||||||
|
// 是否禁用上传
|
||||||
|
isUploading: false,
|
||||||
|
// 设置上传的请求头部
|
||||||
|
headers: { Authorization: "Bearer " + getToken() },
|
||||||
|
// 上传的地址
|
||||||
|
url:
|
||||||
|
process.env.VUE_APP_BASE_API +
|
||||||
|
"/data/compute/rentprice/residence/importData"
|
||||||
|
},
|
||||||
|
// 表单参数
|
||||||
|
form: {},
|
||||||
|
// 表单校验
|
||||||
|
rules: {
|
||||||
|
yearMonth: [
|
||||||
|
{ validator: checkYearMonth, trigger: "blur" },
|
||||||
|
{ validator: checkYearMonth, trigger: "change" }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
created() {
|
||||||
|
this.loading = false;
|
||||||
|
getYearMonthList().then(response => {
|
||||||
|
this.yearMonthList = response.data;
|
||||||
|
});
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
rentTypeFormatter: function(row, column, cellValue, index) {
|
||||||
|
if (cellValue === 1) return "整租";
|
||||||
|
if (cellValue === 2) return "散租";
|
||||||
|
if (cellValue === 3) return "分租";
|
||||||
|
return "无";
|
||||||
|
},
|
||||||
|
caseTypeFormatter: function(row, column, cellValue, index) {
|
||||||
|
if (cellValue == "0") return "成交案例";
|
||||||
|
return "挂牌案例";
|
||||||
|
},
|
||||||
|
youOrWuFormatter: function(row, column, cellValue, index) {
|
||||||
|
if (cellValue) return "有";
|
||||||
|
return "无";
|
||||||
|
},
|
||||||
|
yesOrNotFormatter: function(row, column, cellValue, index) {
|
||||||
|
if (cellValue) return "是";
|
||||||
|
return "否";
|
||||||
|
},
|
||||||
|
statusFormatter: function(row, column, cellValue, index) {
|
||||||
|
if (cellValue === 3) return "当期活跃";
|
||||||
|
if (cellValue === 4) return "当期下架";
|
||||||
|
if (cellValue === 5) return "历史下架";
|
||||||
|
return "否";
|
||||||
|
},
|
||||||
|
/** 查询办公基价列表 */
|
||||||
|
getList() {
|
||||||
|
this.$refs["queryForm"].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
this.loading = true;
|
||||||
|
list(this.queryParams).then(response => {
|
||||||
|
this.dataList = response.rows;
|
||||||
|
this.total = response.total;
|
||||||
|
this.loading = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 取消按钮
|
||||||
|
cancel() {
|
||||||
|
this.open = false;
|
||||||
|
this.reset();
|
||||||
|
},
|
||||||
|
// 表单重置
|
||||||
|
reset() {
|
||||||
|
this.form = {
|
||||||
|
id: undefined
|
||||||
|
};
|
||||||
|
this.resetForm("form");
|
||||||
|
},
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
handleQuery() {
|
||||||
|
this.queryParams.pageIndex = 1;
|
||||||
|
this.getList();
|
||||||
|
},
|
||||||
|
/** 重置按钮操作 */
|
||||||
|
resetQuery() {
|
||||||
|
this.resetForm("queryForm");
|
||||||
|
this.handleQuery();
|
||||||
|
},
|
||||||
|
/** 导出按钮操作 */
|
||||||
|
handleExport() {
|
||||||
|
const queryParams = this.queryParams;
|
||||||
|
this.$refs["queryForm"].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
this.$confirm("是否确认导出所有住宅租赁基价数据项?", "警告", {
|
||||||
|
confirmButtonText: "确定",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning"
|
||||||
|
})
|
||||||
|
.then(function() {
|
||||||
|
return export2File(queryParams);
|
||||||
|
})
|
||||||
|
.then(response => {
|
||||||
|
this.download(response.msg);
|
||||||
|
})
|
||||||
|
.catch(function() {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|