├── .eslintignore ├── .gitignore ├── README.md ├── _config.yml ├── babel.config.js ├── lib ├── Filters │ ├── cascader.vue │ └── date.vue ├── components │ └── table-header.js ├── css │ └── index.css ├── dg-table.js ├── index.js ├── js │ ├── Bus.js │ ├── hoc.js │ └── utils.js └── packages │ ├── cascader │ ├── index.js │ └── src │ │ └── cascader.js │ ├── date-picker │ ├── index.js │ └── src │ │ └── date-picker.js │ ├── dg-filter-wrap │ ├── index.js │ └── src │ │ └── filter-wrap.js │ └── index.js ├── package.json ├── public ├── favicon.ico └── index.html ├── src ├── App.vue ├── assets │ ├── js │ │ └── simulationapi.js │ └── logo.png ├── components │ ├── Gender.vue │ ├── HelloWorld.vue │ ├── MyCascader.vue │ ├── MyDatePicker.vue │ └── myFilter │ │ └── MyInput.vue └── main.js └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /dist 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | src 4 | public 5 | /src 6 | /public 7 | /dist 8 | /images 9 | 10 | # local env files 11 | .env.local 12 | .env.*.local 13 | 14 | # Log files 15 | npm-debug.log* 16 | yarn-debug.log* 17 | yarn-error.log* 18 | 19 | # Editor directories and files 20 | .idea 21 | .vscode 22 | *.suo 23 | *.ntvs* 24 | *.njsproj 25 | *.sln 26 | *.sw* 27 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 由于作者没有编程天赋已经放弃编程 所以这个组件不再更新! 2 | 3 | ## Install 4 | 5 | ```npm 6 | npm install dg-table -S 7 | ``` 8 | 9 | ## Quick Start 10 | #### main.js 11 | ```js 12 | import Vue from 'Vue' 13 | import Element from 'element-ui' // 基于element的 14 | import DgTable from 'dg-table' 15 | 16 | Vue.use(Element) 17 | Vue.use(DgTable) 18 | ``` 19 | #### html 20 | ```html 21 | 22 | ``` 23 | 24 | ## Browser Suppor 25 | Modern browsers and Internet Explorer 10+. 26 | 27 | ## [文档地址](https://www.jianshu.com/p/7ad1e0aafc92) 28 | 29 | ## [demo地址](https://github.com/tccsg/dg-table-demo) 30 | 31 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | theme: jekyll-theme-cayman -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | '@vue/app' 4 | ] 5 | } 6 | -------------------------------------------------------------------------------- /lib/Filters/cascader.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 69 | 70 | -------------------------------------------------------------------------------- /lib/Filters/date.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | -------------------------------------------------------------------------------- /lib/components/table-header.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @param {*} e 3 | */ 4 | let _fbd = null 5 | let _curShowFilter = null 6 | const iconChange = (e, cb, UNID) => { 7 | 8 | e.cancelBubble = true 9 | let iconDom = 10 | document.querySelector(`#${e.currentTarget.id} i`) 11 | _fbd = iconDom 12 | const filterDoms = 13 | document.querySelectorAll(`#__${UNID}_DGTABLE__ .dg-table_filter-wrap`) 14 | const headerIconDoms = 15 | document.querySelectorAll(`#__${UNID}_DGTABLE__ .el-table__header-wrapper .dg-header-icon`) 16 | 17 | const fixed_doms = document.querySelectorAll(`#__${UNID}_DGTABLE__ .el-table__fixed .dg-header-icon`) 18 | 19 | for (let i = 0, length = filterDoms.length; i < length; i++) { 20 | const filterId = filterDoms[i].getAttribute('dataId') 21 | if (filterId === e.currentTarget.id) { 22 | filterDoms[i].style.display = 'inline-block' 23 | _curShowFilter = filterDoms[i] 24 | setFiltersPosition(iconDom, filterDoms[i]) 25 | typeof cb === 'function' && cb(filterId) 26 | } else { 27 | filterDoms[i].style.display = 'none' 28 | } 29 | if (iconDom === headerIconDoms[i]) { 30 | if (fixed_doms[i]) fixed_doms[i].style.transform = 'rotate(-180deg)' 31 | headerIconDoms[i].style.transform = 'rotate(-180deg)' 32 | } else { 33 | if (fixed_doms[i]) fixed_doms[i].style.transform = 'rotate(0deg)' 34 | headerIconDoms[i].style.transform = 'rotate(0deg)' 35 | } 36 | } 37 | } 38 | 39 | function setFiltersPosition (fbd, fd) { 40 | if (!fbd) return 41 | const div_cell = fbd.offsetParent 42 | const th = div_cell.offsetParent 43 | const table_wrap = th.offsetParent 44 | 45 | let offsetLeft = th.offsetLeft 46 | let offsetTop = table_wrap.offsetTop + th.offsetHeight - 10 47 | fd.style.top = offsetTop + 'px' 48 | fd.style.left = offsetLeft + 'px' 49 | } 50 | 51 | export default { 52 | name: 'DgTableHeader', 53 | props: { 54 | id: String, 55 | label: String, 56 | config: Object, 57 | cb: Function, 58 | UNID: String 59 | }, 60 | functional: false, 61 | mounted() { 62 | if (!window.onresize) { 63 | window.onresize = () => { 64 | setTimeout(() => { 65 | if (_fbd && _curShowFilter) 66 | setFiltersPosition(_fbd, _curShowFilter) 67 | }, 0) 68 | } 69 | } 70 | }, 71 | methods: {}, 72 | render (h) { 73 | const { id, config, label, cb, UNID } = this 74 | return ( 75 | config 76 | ? h('span', { 77 | 'class': 'customize_filter', 78 | style: 'cursor:pointer;display:inline-block', 79 | attrs: { 80 | id: id 81 | }, 82 | on: { 83 | click: (e) => { 84 | iconChange(e, cb, UNID) 85 | } 86 | } 87 | }, [ 88 | h('span', { 89 | style: 'padding-right:3px;' 90 | }, [label]), 91 | h('i', { 92 | 'class': 'dg-header-icon el-icon-caret-bottom', 93 | style: 'transition: all .3s' 94 | }) 95 | ]) 96 | : h('span', { 97 | attrs: { 98 | 'class': 'customize_filter', 99 | style: 'display:inline-block' 100 | } 101 | }, [ 102 | h('span', { 103 | attrs: { 104 | style: 'padding-right:3px;' 105 | } 106 | }, [label])]) 107 | ) 108 | } 109 | } -------------------------------------------------------------------------------- /lib/css/index.css: -------------------------------------------------------------------------------- 1 | .dg-filters_hidden-wrap { 2 | height: 0; 3 | width: 0; 4 | position: absolute; 5 | left: 0; 6 | top: 0; 7 | } 8 | .dg-table_filter-wrap { 9 | min-width: 100px; 10 | border: 1px solid #ebeef5; 11 | border-radius: 2px; 12 | background-color: #fff; 13 | box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); 14 | box-sizing: border-box; 15 | margin: 2px 0; 16 | position: absolute; 17 | z-index: 9; 18 | display: none; 19 | overflow: hidden; 20 | } 21 | .customize_filter.active i{ 22 | transform: rotate(-180deg) 23 | } 24 | .dg-table_filter-wrap.dg-table_filter-hideBg { 25 | opacity:0; 26 | /* padding: 10px; */ 27 | box-shadow:none; 28 | } -------------------------------------------------------------------------------- /lib/dg-table.js: -------------------------------------------------------------------------------- 1 | 2 | import DgTableHeader from './components/table-header' 3 | import DgTableDateFilter from './filters/date' 4 | import DgTableCascader from './filters/cascader' 5 | import Bus from './js/Bus' 6 | import { Dom } from './js/utils' 7 | import ElTable from 'element-ui/lib/table' 8 | 9 | // 私有函数的集合 相当于注册函数 10 | const privateHandlers = [ 11 | 'filter-change' 12 | ] 13 | 14 | // 私有属性 15 | const privateProps = [ 16 | 'tableId' 17 | ] 18 | 19 | // 筛选器点击 部分 特殊筛选器 对应的事件 20 | const headClickEven = { 21 | 'date': '__OPEN_DGTABLE_DATE_FILTER__', 22 | 'cascader': '__OPEN_DGTABLE_CASCADER_FILTER__' 23 | } 24 | 25 | const filtersData = { 26 | regFilters: {}, 27 | filterComponents: { 28 | 'date': DgTableDateFilter, 29 | 'cascader': DgTableCascader 30 | }, 31 | curFilterId: '' 32 | } 33 | 34 | const createFilterId = (UNID, ft, p) => { 35 | return `__${UNID}_${ft}_${p}__` 36 | } 37 | 38 | const headClick = (filterId) => { 39 | const { regFilters } = filtersData 40 | const { type } = regFilters[filterId] 41 | filtersData.curFilterId = filterId 42 | if (headClickEven[type]) { 43 | Bus.$emit(headClickEven[type], filterId) 44 | } 45 | } 46 | 47 | // 规范化表格props 和 列配置 数据 48 | const normalizeProps = (context) => { 49 | const props = JSON.parse(JSON.stringify(context.$props || {})) 50 | 51 | for (let k in props) { 52 | if (privateProps.includes(k)) { 53 | delete props[k] 54 | } 55 | } 56 | delete props.configs 57 | const on = context._events 58 | const scopedSlots = context.$scopedSlots 59 | const attrs = {} 60 | 61 | 62 | let privateOn = Object.create(null) 63 | for (let k in on) { 64 | if (privateHandlers.includes(k)) { 65 | privateOn[k] = on[k] 66 | } 67 | } 68 | 69 | return { 70 | on, 71 | scopedSlots, 72 | attrs, 73 | props, 74 | privateOn 75 | } 76 | } 77 | // 渲染 需要的筛选器 78 | const renderFilters = (h, configs, on, UNID) => { 79 | const { regFilters, filterComponents } = filtersData 80 | const { filterConfig = null, columnConfig } = configs 81 | 82 | let filter_id = 'null' 83 | let willRenderFilter = null 84 | if (filterConfig) { 85 | filter_id = createFilterId( 86 | UNID, 87 | filterConfig.type, 88 | columnConfig.prop 89 | ) 90 | if (!regFilters[filter_id]) { 91 | regFilters[filter_id] = filterConfig 92 | } 93 | if (filterComponents[filterConfig.type]) { 94 | if (!filterConfig.component) { 95 | willRenderFilter = filterComponents[filterConfig.type] 96 | } else { 97 | willRenderFilter = filterConfig.component 98 | } 99 | } else if(filterConfig.component 100 | && filterConfig.type === 'custom' 101 | ) { 102 | willRenderFilter = filterConfig.component 103 | } 104 | } 105 | let _private = {} 106 | if (filterConfig) { 107 | _private = filterConfig.type === 'custom' 108 | ? {} 109 | : { 110 | refname: filter_id, 111 | key: columnConfig.prop, 112 | } 113 | } 114 | return ( 115 | filterConfig 116 | ? h('div', { 117 | attrs: { 118 | dataId:filter_id, 119 | 'class': filterComponents[filterConfig.type] 120 | ? 'dg-table_filter-wrap dg-table_filter-hideBg' 121 | : 'dg-table_filter-wrap' 122 | } 123 | }, [ 124 | h(willRenderFilter, { 125 | props: { 126 | config: Object.assign({}, _private, filterConfig.props || {}) 127 | }, 128 | on: { 129 | __DGTABLE_GET_FILTER_DATA__: (res) => { 130 | hideAllFilter(null, UNID) 131 | if (typeof on['filter-change'] === 'function') { 132 | on['filter-change'](res) 133 | } 134 | }, 135 | __CUSTOM_FILTER_DATA__: (custom_data) => { 136 | hideAllFilter(null, UNID) 137 | if (typeof on['filter-change'] === 'function') { 138 | let res = Object.create(null) 139 | if (custom_data.value !== undefined) { 140 | res.value = custom_data.value 141 | } 142 | if (custom_data.label !== undefined) { 143 | res.label = custom_data.label 144 | } 145 | on['filter-change']({ 146 | key: columnConfig.prop, 147 | type: 'custom', 148 | res 149 | }) 150 | } 151 | } 152 | } 153 | }) 154 | ]) 155 | : null 156 | ) 157 | } 158 | const hideAllFilter = (e, UNID) => { 159 | const headerIconDoms = 160 | document.querySelectorAll(`#__${UNID}_DGTABLE__ .dg-header-icon`) 161 | const filterDoms = 162 | document.querySelectorAll(`#__${UNID}_DGTABLE__ .dg-table_filter-wrap`) 163 | const cellDom = e ? Dom.parents(e.target, '.cell') : null 164 | let id = '' 165 | 166 | const specialDom = e ? Dom.parents(e.target, '.el-popper') : null 167 | 168 | if (cellDom && 169 | cellDom.childNodes && 170 | cellDom.childNodes[0] && 171 | cellDom.childNodes[0].getAttribute 172 | ) { 173 | id = cellDom.childNodes[0].getAttribute('id') 174 | } 175 | if (id) { 176 | for (let i = 0, length = headerIconDoms.length; i < length; i++) { 177 | if (headerIconDoms[i].parentNode.getAttribute('id') !== id) { 178 | filterDoms[i] && (filterDoms[i].style.display = 'none') 179 | headerIconDoms[i] && (headerIconDoms[i].style.transform = 'rotate(0deg)') 180 | } 181 | } 182 | } else if (!specialDom) { 183 | for (let i = 0, length = headerIconDoms.length; i < length; i++) { 184 | filterDoms[i] && (filterDoms[i].style.display = 'none') 185 | headerIconDoms[i] && (headerIconDoms[i].style.transform = 'rotate(0deg)') 186 | } 187 | } 188 | } 189 | 190 | export default { 191 | props: Object.assign({}, { 192 | configs: Array, 193 | tableId: String 194 | }, ElTable.props), 195 | name: 'dg-table', 196 | functional: false, 197 | methods: {}, 198 | beforeUpdate () { 199 | // console.log('dg-table update') 200 | }, 201 | render (h) { 202 | const UNID = this.tableId || 'DGTABLE' 203 | const { 204 | on, 205 | scopedSlots, 206 | props, 207 | privateOn } = normalizeProps(this._self) 208 | const configs = this.configs || [] 209 | let filterVnodes = [] 210 | // 渲染列 211 | const renderColumn = configs => configs.map((item, index) => { 212 | const columnConfig = item.columnConfig || {} 213 | const filterConfig = item.filterConfig || null 214 | const component = item.component || null 215 | const curFilter = renderFilters(h, item, privateOn, UNID) 216 | curFilter && filterVnodes.push(curFilter) 217 | 218 | // 如果有自定义 列 标记有作用域槽 219 | let renderScopedSlots = {} 220 | if (component) { 221 | renderScopedSlots = { 222 | default: ({row, column}) => { 223 | return h('div', 224 | {}, 225 | [ 226 | component 227 | ? h(component, { 228 | props: { 229 | row, 230 | column 231 | } 232 | }) 233 | : row[columnConfig.prop] 234 | ] 235 | ) 236 | } 237 | } 238 | } 239 | return h('el-table-column', 240 | { 241 | props:columnConfig, 242 | scopedSlots: renderScopedSlots, 243 | key: `__dg_column_${index}__` 244 | }, 245 | [ filterConfig ? h('template', 246 | {slot: 'header'}, 247 | [ 248 | h(DgTableHeader, { 249 | props: { 250 | id: createFilterId( 251 | UNID, 252 | filterConfig && filterConfig.type || 'null', 253 | columnConfig.prop 254 | ), 255 | label: columnConfig.label, 256 | config: filterConfig || null, 257 | cb: headClick, 258 | UNID: UNID 259 | } 260 | }) 261 | ] 262 | ) : null, 263 | ]) 264 | }) 265 | // return h('div', ['dd']) 266 | return h('div', { 267 | attrs: { 268 | id: `__${UNID}_DGTABLE__` 269 | } 270 | }, [ 271 | h( 272 | ElTable, 273 | { 274 | props: props, 275 | on, 276 | scopedSlots 277 | }, 278 | renderColumn(configs) 279 | ), 280 | h('div', { 281 | 'class': 'dg-filters_hidden-wrap', 282 | directives: [ 283 | { 284 | name: 'dg_table_clickoutside', 285 | expression: (e) => { 286 | hideAllFilter(e, UNID) 287 | } 288 | } 289 | ] 290 | }, filterVnodes) 291 | ]) 292 | } 293 | } 294 | 295 | 296 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | import DGTable from './dg-table' 2 | 3 | DGTable.install = (Vue) => { 4 | Vue.directive('dg_table_clickoutside', { 5 | bind: function (el, binding) { 6 | function documentHandler (e) { 7 | // console.log(e) 8 | if (el.contains(e.target)) { 9 | return false 10 | } 11 | if (binding.expression && typeof binding.expression === 'function') { 12 | binding.expression(e) 13 | } 14 | } 15 | el.__vueClickOutside__ = documentHandler 16 | document.addEventListener('mousedown', documentHandler) 17 | }, 18 | unbind: function (el) { 19 | document.removeEventListener('mousedown', el.__vueClickOutside__) 20 | delete el.__vueClickOutside__ 21 | } 22 | }) 23 | Vue.component( 24 | DGTable.name, 25 | DGTable 26 | ) 27 | } 28 | export default DGTable -------------------------------------------------------------------------------- /lib/js/Bus.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | 3 | const Bus = new Vue() 4 | 5 | export default Bus -------------------------------------------------------------------------------- /lib/js/hoc.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 高阶组件函数对elmentui原本的组件进行二次包装 3 | * 来实现eui原本组件的属性和事件的支持 4 | */ 5 | import Vue from 'vue' 6 | 7 | const wrapElementUiComponents = (wrapedComponent) => { 8 | const extendComponent = Vue.extend(wrapedComponent) 9 | return { 10 | props: extendComponent.props || {}, 11 | render: function (h) { 12 | const slots = Object.keys(this.$slots) 13 | .reduce((arr, key) => arr.concat(this.$slots[key]), []) 14 | .map(vnode => { 15 | vnode.context = this._self 16 | return vnode 17 | }) 18 | return h(extendComponent, { 19 | props: this.$props 20 | }, [slots]) 21 | } 22 | } 23 | } 24 | 25 | export default wrapElementUiComponents 26 | -------------------------------------------------------------------------------- /lib/js/utils.js: -------------------------------------------------------------------------------- 1 | export const Dom = { 2 | _selectType: { 3 | '.': 'class', 4 | '#': 'id' 5 | }, 6 | parent: (node) => { 7 | return document.querySelector(node).parentNode 8 | }, 9 | parents: (node, parentName) => { 10 | let pNode = typeof node === 'string' ? Dom.parent(node) : node.parentNode 11 | let type = parentName.substring(0, 1) 12 | let typeName = parentName.substring(1) 13 | 14 | if (pNode.nodeType !== 1) return null 15 | const curTypeName = pNode.nodeType === 1 ? pNode.getAttribute(Dom._selectType[type]) : '' 16 | const typeNames = curTypeName && curTypeName.split(" ") || [] 17 | if (typeNames.includes(typeName)) { 18 | return pNode 19 | } else { 20 | if (pNode) { 21 | pNode = Dom.parents(pNode, parentName) 22 | } else { 23 | pNode = null 24 | } 25 | } 26 | return pNode 27 | } 28 | } 29 | 30 | export const randomString = function (len) { 31 | len = len || 32 32 | var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678' 33 | var maxPos = $chars.length 34 | var pwd = '' 35 | for (let i = 0; i < len; i++) { 36 | pwd += $chars.charAt(Math.floor(Math.random() * maxPos)) 37 | } 38 | return pwd 39 | } 40 | 41 | export const uuid = () => { 42 | var s = []; 43 | var hexDigits = "0123456789abcdef"; 44 | for (var i = 0; i < 36; i++) { 45 | s[i] = hexDigits.substr(Math.floor(Math.random() * 0x10), 1); 46 | } 47 | s[14] = "4"; // bits 12-15 of the time_hi_and_version field to 0010 48 | s[19] = hexDigits.substr((s[19] & 0x3) | 0x8, 1); // bits 6-7 of the clock_seq_hi_and_reserved to 01 49 | s[8] = s[13] = s[18] = s[23] = "-"; 50 | 51 | var uuid = s.join(""); 52 | return uuid; 53 | } -------------------------------------------------------------------------------- /lib/packages/cascader/index.js: -------------------------------------------------------------------------------- 1 | import DgCascader from './src/cascader' 2 | 3 | DgCascader.install = function install (Vue) { 4 | Vue.component(DgCascader.name, DgCascader) 5 | } 6 | 7 | export default DgCascader -------------------------------------------------------------------------------- /lib/packages/cascader/src/cascader.js: -------------------------------------------------------------------------------- 1 | import Bus from '../../../js/Bus.js' 2 | 3 | export default { 4 | name: 'DgCascader', 5 | props: ['config'], 6 | functional: false, 7 | methods: { 8 | handleChange (value) { 9 | const { key } = this.config || {} 10 | const { options } = this.$attrs 11 | let label = this.getLabel(value, options) 12 | setTimeout(() => { 13 | this.$parent.$emit('__DGTABLE_GET_FILTER_DATA__', { 14 | key, 15 | res: { 16 | value: value[value.length - 1], 17 | label 18 | }, 19 | type: 'cascader' 20 | }) 21 | }, 0) 22 | }, 23 | getLabel (value, d) { 24 | if (!d) return 25 | let _value = JSON.parse(JSON.stringify(value)) 26 | let labelstr = '' 27 | let val = value[0] 28 | const { props } = this.$attrs 29 | 30 | for (let i = 0; i < d.length; i++) { 31 | if (d[i][props.value] === val) { 32 | if (d[i] && d[i][props.children]) { 33 | _value.splice(0, 1) 34 | labelstr += this.getLabel(_value, d[i][props.children]) 35 | return d[i][props.label] + labelstr 36 | } else { 37 | return d[i][props.label] 38 | } 39 | } 40 | } 41 | } 42 | }, 43 | mounted () { 44 | const { refname = '' } = this.config || {} 45 | Bus.$on('__OPEN_DGTABLE_CASCADER_FILTER__', fid => { 46 | if (refname === fid && this.$refs[fid]) { 47 | this.$refs[fid].handleInput() 48 | } 49 | }) 50 | }, 51 | render: function (h) { 52 | const { config, $attrs, $listeners } = this 53 | const props = JSON.parse(JSON.stringify(this.$props)) 54 | 55 | return h('el-cascader', { 56 | attrs: JSON.parse(JSON.stringify($attrs)), 57 | on: Object.assign({}, $listeners, { 58 | change: this.handleChange 59 | }), 60 | props, 61 | style: 'height:0;padding:0;top:-15px', 62 | ref: config.refname 63 | }) 64 | } 65 | } -------------------------------------------------------------------------------- /lib/packages/date-picker/index.js: -------------------------------------------------------------------------------- 1 | import DgDatePicker from './src/date-picker' 2 | 3 | DgDatePicker.install = function install (Vue) { 4 | Vue.component(DgDatePicker.name, DgDatePicker) 5 | } 6 | 7 | export default DgDatePicker -------------------------------------------------------------------------------- /lib/packages/date-picker/src/date-picker.js: -------------------------------------------------------------------------------- 1 | 2 | import Bus from '../../../js/Bus.js' 3 | 4 | export default { 5 | name: 'DgDatePicker', 6 | props: ['config'], 7 | functional: false, 8 | mounted () { 9 | const { refname = '' } = this.config || {} 10 | Bus.$on('__OPEN_DGTABLE_DATE_FILTER__', fid => { 11 | if (this.$refs[fid]) { 12 | if (refname === fid) this.$refs[fid].focus() 13 | } 14 | }) 15 | }, 16 | methods: { 17 | changeData (val) { 18 | const { key } = this.config || {} 19 | this.$parent.$emit('__DGTABLE_GET_FILTER_DATA__', { 20 | type: 'date', 21 | key, 22 | res: { 23 | value: val 24 | } 25 | }) 26 | } 27 | }, 28 | render: function (h) { 29 | const { config, $attrs, $listeners } = this 30 | const props = JSON.parse(JSON.stringify(this.$props)) 31 | // 合并自定义change函数 32 | const changeHandlers = (val) => { 33 | this.changeData(val) 34 | $listeners.change && $listeners.change(val) 35 | } 36 | return h('el-date-picker', { 37 | attrs: $attrs, 38 | on: Object.assign({}, $listeners, { 39 | change: changeHandlers, 40 | input: changeHandlers 41 | }), 42 | props, 43 | style: 'width:0;height:0;padding:0;top:-10px', 44 | ref: config.refname 45 | }) 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /lib/packages/dg-filter-wrap/index.js: -------------------------------------------------------------------------------- 1 | import DgFilterWrap from './src/filter-wrap' 2 | 3 | DgFilterWrap.install = function install (Vue) { 4 | Vue.component(DgFilterWrap.name, DgFilterWrap) 5 | } 6 | 7 | export default DgFilterWrap -------------------------------------------------------------------------------- /lib/packages/dg-filter-wrap/src/filter-wrap.js: -------------------------------------------------------------------------------- 1 | const anyType = [String, Number, Boolean, Function, Object, Array, Symbol] 2 | export default { 3 | name: 'DgFilterWrap', 4 | props: { 5 | filterHandler: Function, 6 | value: anyType, 7 | label: String 8 | }, 9 | functional: false, 10 | render (h) { 11 | console.log(this) 12 | 13 | const { $slots } = this 14 | 15 | return h('div', $slots.default) 16 | }, 17 | mounted () { 18 | this.$on('__CUSTOM_FILTER_DATA__', res => { 19 | console.log(res) 20 | }) 21 | } 22 | } -------------------------------------------------------------------------------- /lib/packages/index.js: -------------------------------------------------------------------------------- 1 | import DgCascader from './cascader' 2 | import DgDatePicker from './date-picker' 3 | import DgFilterWrap from './dg-filter-wrap' 4 | 5 | export { 6 | DgCascader, 7 | DgDatePicker, 8 | DgFilterWrap 9 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dg-table", 3 | "version": "2.0.9", 4 | "private": false, 5 | "main": "lib/index.js", 6 | "scripts": { 7 | "serve": "vue-cli-service serve", 8 | "build": "vue-cli-service build", 9 | "lint": "vue-cli-service lint", 10 | "dg-mp": "dg-mp" 11 | }, 12 | "dependencies": { 13 | "core-js": "^2.6.5", 14 | "dg-mp": "^1.0.3", 15 | "element-ui": "^2.11.1", 16 | "vue": "^2.6.10" 17 | }, 18 | "keywords": ["Vue","Element"], 19 | "author": "GeniusChenSG", 20 | "repository": { 21 | "type": "git", 22 | "url": "git+https://github.com/tccsg/dg-table.git" 23 | }, 24 | "license": "MIT", 25 | "devDependencies": { 26 | "@vue/cli-plugin-babel": "^3.10.0", 27 | "@vue/cli-plugin-eslint": "^3.10.0", 28 | "@vue/cli-service": "^3.10.0", 29 | "babel-eslint": "^10.0.1", 30 | "eslint": "^5.16.0", 31 | "eslint-plugin-vue": "^5.0.0", 32 | "vue-template-compiler": "^2.6.10" 33 | }, 34 | "eslintConfig": { 35 | "root": true, 36 | "env": { 37 | "node": true 38 | }, 39 | "extends": [ 40 | "plugin:vue/essential", 41 | "eslint:recommended" 42 | ], 43 | "rules": { 44 | "no-console": "off" 45 | }, 46 | "parserOptions": { 47 | "parser": "babel-eslint" 48 | } 49 | }, 50 | "postcss": { 51 | "plugins": { 52 | "autoprefixer": {} 53 | } 54 | }, 55 | "browserslist": [ 56 | "> 1%", 57 | "last 2 versions" 58 | ] 59 | } 60 | -------------------------------------------------------------------------------- /public/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tccsg/dg-table/a5a2d4f8d948ef4b1e12fc04ba6dce5a9ff12339/public/favicon.ico -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | dg-table-v2 9 | 10 | 11 | 14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 148 | 149 | 164 | -------------------------------------------------------------------------------- /src/assets/js/simulationapi.js: -------------------------------------------------------------------------------- 1 | // 用于模拟搜索的数据 2 | let allusers = [] // 全部数据 3 | let CUR_FILTERDATA = [] // 过滤后的数据 4 | 5 | let perpagecount = 10 // 每页显示的数量 6 | // let CUR_PAGE = 1 7 | 8 | export const searchdata = (k = {}) => { 9 | let data = [] 10 | for (let i = 0; i < allusers.length; i++) { 11 | if (allusers[i].name.indexOf(k.name) !== -1) { 12 | data.push(allusers[i]) 13 | } 14 | } 15 | return Promise.resolve(data) 16 | } 17 | export const dofilter = (allfilter = {}) => { 18 | let data = [] 19 | let filter = allfilter.filters 20 | let page = allfilter.page 21 | for (let i = 0; i < allusers.length; i++) { 22 | let sameKeyNum = 0 23 | for (let k in filter) { 24 | if (k === 'birthPlace') { 25 | if (allusers[i][k].child.code === filter[k] + '') sameKeyNum++ 26 | } 27 | if (k === 'birthDay') { 28 | var gt = new Date(filter[k]['gt']).getTime() 29 | var lt = new Date(filter[k]['lt']).getTime() 30 | var usertime = new Date(allusers[i][k]).getTime() 31 | if (usertime <= lt && usertime >= gt) { 32 | sameKeyNum++ 33 | } 34 | } 35 | if (k === 'age') { 36 | let agea = filter[k].split(',') 37 | if (allusers[i][k] <= agea[1] && allusers[i][k] >= agea[0]) { 38 | sameKeyNum++ 39 | } 40 | } 41 | if (allusers[i][k] === filter[k] + '') { 42 | sameKeyNum++ 43 | } 44 | } 45 | if (sameKeyNum === Object.keys(filter).length) data.push(allusers[i]) 46 | } 47 | if (Object.keys(filter).length === 0) data = allusers 48 | CUR_FILTERDATA = data 49 | let rdata = CUR_FILTERDATA.slice(perpagecount * (page - 1), perpagecount * (page - 1) + perpagecount) 50 | let _page = Math.ceil(data.length / perpagecount) ? Math.ceil(data.length / perpagecount) : 1 51 | let res = { 52 | data: rdata, 53 | pagenum: _page 54 | } 55 | return res 56 | } 57 | // 模拟radio 58 | export const radiodata = () => { 59 | let data = [ 60 | { label: '项目1', value: 1 }, 61 | { label: '项目2', value: 2 }, 62 | { label: '项目3', value: 3 }, 63 | { label: '项目4', value: 4 }, 64 | { label: '项目5', value: 5 } 65 | ] 66 | return Promise.resolve(data) 67 | } 68 | // 随机生成表数据 69 | export const createTableDataByRandom = (len) => { 70 | let users = [] 71 | const xarr = ['王', '黄', '陈', '方', '林', '刘', '张', '吴', '蔡', '龚', '杨', '潘', '俞', '庄', '许', '徐', '欧阳', '欧', '诸葛', '肖', '涂', '严', '颜', '冯', '曾'] 72 | const nchar = ['容止', '羡林', '芷', '回', '言蹊', '思睿', '怀瑾', '瑾', '遇', '道韫', '弦', '柳', '酒', '梦', '桑', '遥', '雨夕', '风遥', '雁白', '青沐', '合', '逸思', '霏', '清疏', '秋荻', '廷轩', '轩', '宇', '絮影', '清淮', '柳依', '寒箫', '箫', '惜夏', '意轩', '旖旎', '慕青', '宣', '晓', '沛', '斯年', '莲舟', '依凝', '井与', '予锦', '艳', '淑芬', '思哲', '湛', '梦文', '承嗣', '博艺', '玲杰', '德馨', '琪维', '俊', '钰', '蔚', '彬郁', '诗嘉', '津媛', '艺歆', '奕然', '雯梦', '思佳'] 73 | const phead = ['134', '135', '137', '138', '155', '130', '186', '133', '153', '180', '150', '151', '188'] 74 | const numstr = '0123456789' 75 | const gchar = ['1', '2'] 76 | const csign = ['+', '-'] 77 | const bcity = cities() 78 | let byear = 1996 79 | for (let i = 0; i < len; i++) { 80 | let curuser = {} 81 | let cursing = csign[Math.floor(Math.random() * csign.length)] 82 | 83 | let curx = xarr[Math.floor(Math.random() * xarr.length)] 84 | let curn = nchar[Math.floor(Math.random() * nchar.length)] 85 | let cury = 1996 86 | let curm = Math.floor(Math.random() * 11) + 1 87 | let curd = Math.floor(Math.random() * 29) + 1 88 | let gender = gchar[Math.floor(Math.random() * gchar.length)] 89 | if (cursing === '+') cury = byear + Math.floor(Math.random() * 10) 90 | if (cursing === '-') cury = byear - Math.floor(Math.random() * 10) 91 | let age = 2018 - cury 92 | // 获取手机号 93 | let phone = phead[Math.floor(Math.random() * phead.length)] 94 | for (let j = 0; j < 8; j++) { 95 | phone += numstr.charAt(Math.floor(Math.random() * numstr.length)) 96 | } 97 | let province = bcity[Math.floor(Math.random() * bcity.length)] 98 | let city = province.children[Math.floor(Math.random() * province.children.length)] 99 | let birthPlace = JSON.parse(JSON.stringify(province)) 100 | birthPlace.child = city 101 | delete birthPlace.children 102 | curuser = { 103 | gender, 104 | age, 105 | phone, 106 | birthPlace, 107 | name: curx + curn, 108 | uid: randomString(16), 109 | birthDay: cury + '.' + curm + '.' + curd 110 | } 111 | users.push(curuser) 112 | } 113 | allusers = JSON.parse(JSON.stringify(users)) 114 | let _page = Math.ceil(users.length / perpagecount) ? Math.ceil(users.length / perpagecount) : 1 115 | let rdata = users.slice(0, perpagecount) 116 | let res = { 117 | data: rdata, 118 | pagenum: _page 119 | } 120 | return res 121 | } 122 | // 获取uid 123 | const randomString = function (len) { 124 | len = len || 32 125 | var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678' 126 | var maxPos = $chars.length 127 | var pwd = '' 128 | for (let i = 0; i < len; i++) { 129 | pwd += $chars.charAt(Math.floor(Math.random() * maxPos)) 130 | } 131 | return 'uid_' + pwd 132 | } 133 | // 表数据 134 | export const tabledata = () => { 135 | let data = [] 136 | return Promise.resolve(data) 137 | } 138 | 139 | // 获取城市 140 | export const cities = () => { 141 | let data = [{ 'code': '11', 'name': '北京市', 'children': [{ 'code': '1101', 'name': '北京市辖区' }] }, { 'code': '12', 'name': '天津市', 'children': [{ 'code': '1201', 'name': '天津市辖区' }] }, { 'code': '13', 'name': '河北省', 'children': [{ 'code': '1301', 'name': '石家庄市' }, { 'code': '1302', 'name': '唐山市' }, { 'code': '1303', 'name': '秦皇岛市' }, { 'code': '1304', 'name': '邯郸市' }, { 'code': '1305', 'name': '邢台市' }, { 'code': '1306', 'name': '保定市' }, { 'code': '1307', 'name': '张家口市' }, { 'code': '1308', 'name': '承德市' }, { 'code': '1309', 'name': '沧州市' }, { 'code': '1310', 'name': '廊坊市' }, { 'code': '1311', 'name': '衡水市' }] }, { 'code': '14', 'name': '山西省', 'children': [{ 'code': '1401', 'name': '太原市' }, { 'code': '1402', 'name': '大同市' }, { 'code': '1403', 'name': '阳泉市' }, { 'code': '1404', 'name': '长治市' }, { 'code': '1405', 'name': '晋城市' }, { 'code': '1406', 'name': '朔州市' }, { 'code': '1407', 'name': '晋中市' }, { 'code': '1408', 'name': '运城市' }, { 'code': '1409', 'name': '忻州市' }, { 'code': '1410', 'name': '临汾市' }, { 'code': '1411', 'name': '吕梁市' }] }, { 'code': '15', 'name': '内蒙古自治区', 'children': [{ 'code': '1501', 'name': '呼和浩特市' }, { 'code': '1502', 'name': '包头市' }, { 'code': '1503', 'name': '乌海市' }, { 'code': '1504', 'name': '赤峰市' }, { 'code': '1505', 'name': '通辽市' }, { 'code': '1506', 'name': '鄂尔多斯市' }, { 'code': '1507', 'name': '呼伦贝尔市' }, { 'code': '1508', 'name': '巴彦淖尔市' }, { 'code': '1509', 'name': '乌兰察布市' }, { 'code': '1522', 'name': '兴安盟' }, { 'code': '1525', 'name': '锡林郭勒盟' }, { 'code': '1529', 'name': '阿拉善盟' }] }, { 'code': '21', 'name': '辽宁省', 'children': [{ 'code': '2101', 'name': '沈阳市' }, { 'code': '2102', 'name': '大连市' }, { 'code': '2103', 'name': '鞍山市' }, { 'code': '2104', 'name': '抚顺市' }, { 'code': '2105', 'name': '本溪市' }, { 'code': '2106', 'name': '丹东市' }, { 'code': '2107', 'name': '锦州市' }, { 'code': '2108', 'name': '营口市' }, { 'code': '2109', 'name': '阜新市' }, { 'code': '2110', 'name': '辽阳市' }, { 'code': '2111', 'name': '盘锦市' }, { 'code': '2112', 'name': '铁岭市' }, { 'code': '2113', 'name': '朝阳市' }, { 'code': '2114', 'name': '葫芦岛市' }] }, { 'code': '22', 'name': '吉林省', 'children': [{ 'code': '2201', 'name': '长春市' }, { 'code': '2202', 'name': '吉林市' }, { 'code': '2203', 'name': '四平市' }, { 'code': '2204', 'name': '辽源市' }, { 'code': '2205', 'name': '通化市' }, { 'code': '2206', 'name': '白山市' }, { 'code': '2207', 'name': '松原市' }, { 'code': '2208', 'name': '白城市' }, { 'code': '2224', 'name': '延边朝鲜族自治州' }] }, { 'code': '23', 'name': '黑龙江省', 'children': [{ 'code': '2301', 'name': '哈尔滨市' }, { 'code': '2302', 'name': '齐齐哈尔市' }, { 'code': '2303', 'name': '鸡西市' }, { 'code': '2304', 'name': '鹤岗市' }, { 'code': '2305', 'name': '双鸭山市' }, { 'code': '2306', 'name': '大庆市' }, { 'code': '2307', 'name': '伊春市' }, { 'code': '2308', 'name': '佳木斯市' }, { 'code': '2309', 'name': '七台河市' }, { 'code': '2310', 'name': '牡丹江市' }, { 'code': '2311', 'name': '黑河市' }, { 'code': '2312', 'name': '绥化市' }, { 'code': '2327', 'name': '大兴安岭地区' }] }, { 'code': '31', 'name': '上海市', 'children': [{ 'code': '3101', 'name': '上海市辖区' }] }, { 'code': '32', 'name': '江苏省', 'children': [{ 'code': '3201', 'name': '南京市' }, { 'code': '3202', 'name': '无锡市' }, { 'code': '3203', 'name': '徐州市' }, { 'code': '3204', 'name': '常州市' }, { 'code': '3205', 'name': '苏州市' }, { 'code': '3206', 'name': '南通市' }, { 'code': '3207', 'name': '连云港市' }, { 'code': '3208', 'name': '淮安市' }, { 'code': '3209', 'name': '盐城市' }, { 'code': '3210', 'name': '扬州市' }, { 'code': '3211', 'name': '镇江市' }, { 'code': '3212', 'name': '泰州市' }, { 'code': '3213', 'name': '宿迁市' }] }, { 'code': '33', 'name': '浙江省', 'children': [{ 'code': '3301', 'name': '杭州市' }, { 'code': '3302', 'name': '宁波市' }, { 'code': '3303', 'name': '温州市' }, { 'code': '3304', 'name': '嘉兴市' }, { 'code': '3305', 'name': '湖州市' }, { 'code': '3306', 'name': '绍兴市' }, { 'code': '3307', 'name': '金华市' }, { 'code': '3308', 'name': '衢州市' }, { 'code': '3309', 'name': '舟山市' }, { 'code': '3310', 'name': '台州市' }, { 'code': '3311', 'name': '丽水市' }] }, { 'code': '34', 'name': '安徽省', 'children': [{ 'code': '3401', 'name': '合肥市' }, { 'code': '3402', 'name': '芜湖市' }, { 'code': '3403', 'name': '蚌埠市' }, { 'code': '3404', 'name': '淮南市' }, { 'code': '3405', 'name': '马鞍山市' }, { 'code': '3406', 'name': '淮北市' }, { 'code': '3407', 'name': '铜陵市' }, { 'code': '3408', 'name': '安庆市' }, { 'code': '3410', 'name': '黄山市' }, { 'code': '3411', 'name': '滁州市' }, { 'code': '3412', 'name': '阜阳市' }, { 'code': '3413', 'name': '宿州市' }, { 'code': '3415', 'name': '六安市' }, { 'code': '3416', 'name': '亳州市' }, { 'code': '3417', 'name': '池州市' }, { 'code': '3418', 'name': '宣城市' }] }, { 'code': '35', 'name': '福建省', 'children': [{ 'code': '3501', 'name': '福州市' }, { 'code': '3502', 'name': '厦门市' }, { 'code': '3503', 'name': '莆田市' }, { 'code': '3504', 'name': '三明市' }, { 'code': '3505', 'name': '泉州市' }, { 'code': '3506', 'name': '漳州市' }, { 'code': '3507', 'name': '南平市' }, { 'code': '3508', 'name': '龙岩市' }, { 'code': '3509', 'name': '宁德市' }] }, { 'code': '36', 'name': '江西省', 'children': [{ 'code': '3601', 'name': '南昌市' }, { 'code': '3602', 'name': '景德镇市' }, { 'code': '3603', 'name': '萍乡市' }, { 'code': '3604', 'name': '九江市' }, { 'code': '3605', 'name': '新余市' }, { 'code': '3606', 'name': '鹰潭市' }, { 'code': '3607', 'name': '赣州市' }, { 'code': '3608', 'name': '吉安市' }, { 'code': '3609', 'name': '宜春市' }, { 'code': '3610', 'name': '抚州市' }, { 'code': '3611', 'name': '上饶市' }] }, { 'code': '37', 'name': '山东省', 'children': [{ 'code': '3701', 'name': '济南市' }, { 'code': '3702', 'name': '青岛市' }, { 'code': '3703', 'name': '淄博市' }, { 'code': '3704', 'name': '枣庄市' }, { 'code': '3705', 'name': '东营市' }, { 'code': '3706', 'name': '烟台市' }, { 'code': '3707', 'name': '潍坊市' }, { 'code': '3708', 'name': '济宁市' }, { 'code': '3709', 'name': '泰安市' }, { 'code': '3710', 'name': '威海市' }, { 'code': '3711', 'name': '日照市' }, { 'code': '3712', 'name': '莱芜市' }, { 'code': '3713', 'name': '临沂市' }, { 'code': '3714', 'name': '德州市' }, { 'code': '3715', 'name': '聊城市' }, { 'code': '3716', 'name': '滨州市' }, { 'code': '3717', 'name': '菏泽市' }] }, { 'code': '41', 'name': '河南省', 'children': [{ 'code': '4101', 'name': '郑州市' }, { 'code': '4102', 'name': '开封市' }, { 'code': '4103', 'name': '洛阳市' }, { 'code': '4104', 'name': '平顶山市' }, { 'code': '4105', 'name': '安阳市' }, { 'code': '4106', 'name': '鹤壁市' }, { 'code': '4107', 'name': '新乡市' }, { 'code': '4108', 'name': '焦作市' }, { 'code': '4109', 'name': '濮阳市' }, { 'code': '4110', 'name': '许昌市' }, { 'code': '4111', 'name': '漯河市' }, { 'code': '4112', 'name': '三门峡市' }, { 'code': '4113', 'name': '南阳市' }, { 'code': '4114', 'name': '商丘市' }, { 'code': '4115', 'name': '信阳市' }, { 'code': '4116', 'name': '周口市' }, { 'code': '4117', 'name': '驻马店市' }, { 'code': '4190', 'name': '省直辖县级行政区划' }] }, { 'code': '42', 'name': '湖北省', 'children': [{ 'code': '4201', 'name': '武汉市' }, { 'code': '4202', 'name': '黄石市' }, { 'code': '4203', 'name': '十堰市' }, { 'code': '4205', 'name': '宜昌市' }, { 'code': '4206', 'name': '襄阳市' }, { 'code': '4207', 'name': '鄂州市' }, { 'code': '4208', 'name': '荆门市' }, { 'code': '4209', 'name': '孝感市' }, { 'code': '4210', 'name': '荆州市' }, { 'code': '4211', 'name': '黄冈市' }, { 'code': '4212', 'name': '咸宁市' }, { 'code': '4213', 'name': '随州市' }, { 'code': '4228', 'name': '恩施土家族苗族自治州' }, { 'code': '4290', 'name': '省直辖县级行政区划' }] }, { 'code': '43', 'name': '湖南省', 'children': [{ 'code': '4301', 'name': '长沙市' }, { 'code': '4302', 'name': '株洲市' }, { 'code': '4303', 'name': '湘潭市' }, { 'code': '4304', 'name': '衡阳市' }, { 'code': '4305', 'name': '邵阳市' }, { 'code': '4306', 'name': '岳阳市' }, { 'code': '4307', 'name': '常德市' }, { 'code': '4308', 'name': '张家界市' }, { 'code': '4309', 'name': '益阳市' }, { 'code': '4310', 'name': '郴州市' }, { 'code': '4311', 'name': '永州市' }, { 'code': '4312', 'name': '怀化市' }, { 'code': '4313', 'name': '娄底市' }, { 'code': '4331', 'name': '湘西土家族苗族自治州' }] }, { 'code': '44', 'name': '广东省', 'children': [{ 'code': '4401', 'name': '广州市' }, { 'code': '4402', 'name': '韶关市' }, { 'code': '4403', 'name': '深圳市' }, { 'code': '4404', 'name': '珠海市' }, { 'code': '4405', 'name': '汕头市' }, { 'code': '4406', 'name': '佛山市' }, { 'code': '4407', 'name': '江门市' }, { 'code': '4408', 'name': '湛江市' }, { 'code': '4409', 'name': '茂名市' }, { 'code': '4412', 'name': '肇庆市' }, { 'code': '4413', 'name': '惠州市' }, { 'code': '4414', 'name': '梅州市' }, { 'code': '4415', 'name': '汕尾市' }, { 'code': '4416', 'name': '河源市' }, { 'code': '4417', 'name': '阳江市' }, { 'code': '4418', 'name': '清远市' }, { 'code': '4419', 'name': '东莞市' }, { 'code': '4420', 'name': '中山市' }, { 'code': '4451', 'name': '潮州市' }, { 'code': '4452', 'name': '揭阳市' }, { 'code': '4453', 'name': '云浮市' }] }, { 'code': '45', 'name': '广西壮族自治区', 'children': [{ 'code': '4501', 'name': '南宁市' }, { 'code': '4502', 'name': '柳州市' }, { 'code': '4503', 'name': '桂林市' }, { 'code': '4504', 'name': '梧州市' }, { 'code': '4505', 'name': '北海市' }, { 'code': '4506', 'name': '防城港市' }, { 'code': '4507', 'name': '钦州市' }, { 'code': '4508', 'name': '贵港市' }, { 'code': '4509', 'name': '玉林市' }, { 'code': '4510', 'name': '百色市' }, { 'code': '4511', 'name': '贺州市' }, { 'code': '4512', 'name': '河池市' }, { 'code': '4513', 'name': '来宾市' }, { 'code': '4514', 'name': '崇左市' }] }, { 'code': '46', 'name': '海南省', 'children': [{ 'code': '4601', 'name': '海口市' }, { 'code': '4602', 'name': '三亚市' }, { 'code': '4603', 'name': '三沙市' }, { 'code': '4604', 'name': '儋州市' }, { 'code': '4690', 'name': '省直辖县级行政区划' }] }, { 'code': '50', 'name': '重庆市', 'children': [{ 'code': '5001', 'name': '重庆市辖区' }, { 'code': '5002', 'name': '县' }] }, { 'code': '51', 'name': '四川省', 'children': [{ 'code': '5101', 'name': '成都市' }, { 'code': '5103', 'name': '自贡市' }, { 'code': '5104', 'name': '攀枝花市' }, { 'code': '5105', 'name': '泸州市' }, { 'code': '5106', 'name': '德阳市' }, { 'code': '5107', 'name': '绵阳市' }, { 'code': '5108', 'name': '广元市' }, { 'code': '5109', 'name': '遂宁市' }, { 'code': '5110', 'name': '内江市' }, { 'code': '5111', 'name': '乐山市' }, { 'code': '5113', 'name': '南充市' }, { 'code': '5114', 'name': '眉山市' }, { 'code': '5115', 'name': '宜宾市' }, { 'code': '5116', 'name': '广安市' }, { 'code': '5117', 'name': '达州市' }, { 'code': '5118', 'name': '雅安市' }, { 'code': '5119', 'name': '巴中市' }, { 'code': '5120', 'name': '资阳市' }, { 'code': '5132', 'name': '阿坝藏族羌族自治州' }, { 'code': '5133', 'name': '甘孜藏族自治州' }, { 'code': '5134', 'name': '凉山彝族自治州' }] }, { 'code': '52', 'name': '贵州省', 'children': [{ 'code': '5201', 'name': '贵阳市' }, { 'code': '5202', 'name': '六盘水市' }, { 'code': '5203', 'name': '遵义市' }, { 'code': '5204', 'name': '安顺市' }, { 'code': '5205', 'name': '毕节市' }, { 'code': '5206', 'name': '铜仁市' }, { 'code': '5223', 'name': '黔西南布依族苗族自治州' }, { 'code': '5226', 'name': '黔东南苗族侗族自治州' }, { 'code': '5227', 'name': '黔南布依族苗族自治州' }] }, { 'code': '53', 'name': '云南省', 'children': [{ 'code': '5301', 'name': '昆明市' }, { 'code': '5303', 'name': '曲靖市' }, { 'code': '5304', 'name': '玉溪市' }, { 'code': '5305', 'name': '保山市' }, { 'code': '5306', 'name': '昭通市' }, { 'code': '5307', 'name': '丽江市' }, { 'code': '5308', 'name': '普洱市' }, { 'code': '5309', 'name': '临沧市' }, { 'code': '5323', 'name': '楚雄彝族自治州' }, { 'code': '5325', 'name': '红河哈尼族彝族自治州' }, { 'code': '5326', 'name': '文山壮族苗族自治州' }, { 'code': '5328', 'name': '西双版纳傣族自治州' }, { 'code': '5329', 'name': '大理白族自治州' }, { 'code': '5331', 'name': '德宏傣族景颇族自治州' }, { 'code': '5333', 'name': '怒江傈僳族自治州' }, { 'code': '5334', 'name': '迪庆藏族自治州' }] }, { 'code': '54', 'name': '西藏自治区', 'children': [{ 'code': '5401', 'name': '拉萨市' }, { 'code': '5402', 'name': '日喀则市' }, { 'code': '5403', 'name': '昌都市' }, { 'code': '5404', 'name': '林芝市' }, { 'code': '5405', 'name': '山南市' }, { 'code': '5424', 'name': '那曲地区' }, { 'code': '5425', 'name': '阿里地区' }] }, { 'code': '61', 'name': '陕西省', 'children': [{ 'code': '6101', 'name': '西安市' }, { 'code': '6102', 'name': '铜川市' }, { 'code': '6103', 'name': '宝鸡市' }, { 'code': '6104', 'name': '咸阳市' }, { 'code': '6105', 'name': '渭南市' }, { 'code': '6106', 'name': '延安市' }, { 'code': '6107', 'name': '汉中市' }, { 'code': '6108', 'name': '榆林市' }, { 'code': '6109', 'name': '安康市' }, { 'code': '6110', 'name': '商洛市' }] }, { 'code': '62', 'name': '甘肃省', 'children': [{ 'code': '6201', 'name': '兰州市' }, { 'code': '6202', 'name': '嘉峪关市' }, { 'code': '6203', 'name': '金昌市' }, { 'code': '6204', 'name': '白银市' }, { 'code': '6205', 'name': '天水市' }, { 'code': '6206', 'name': '武威市' }, { 'code': '6207', 'name': '张掖市' }, { 'code': '6208', 'name': '平凉市' }, { 'code': '6209', 'name': '酒泉市' }, { 'code': '6210', 'name': '庆阳市' }, { 'code': '6211', 'name': '定西市' }, { 'code': '6212', 'name': '陇南市' }, { 'code': '6229', 'name': '临夏回族自治州' }, { 'code': '6230', 'name': '甘南藏族自治州' }] }, { 'code': '63', 'name': '青海省', 'children': [{ 'code': '6301', 'name': '西宁市' }, { 'code': '6302', 'name': '海东市' }, { 'code': '6322', 'name': '海北藏族自治州' }, { 'code': '6323', 'name': '黄南藏族自治州' }, { 'code': '6325', 'name': '海南藏族自治州' }, { 'code': '6326', 'name': '果洛藏族自治州' }, { 'code': '6327', 'name': '玉树藏族自治州' }, { 'code': '6328', 'name': '海西蒙古族藏族自治州' }] }, { 'code': '64', 'name': '宁夏回族自治区', 'children': [{ 'code': '6401', 'name': '银川市' }, { 'code': '6402', 'name': '石嘴山市' }, { 'code': '6403', 'name': '吴忠市' }, { 'code': '6404', 'name': '固原市' }, { 'code': '6405', 'name': '中卫市' }] }, { 'code': '65', 'name': '新疆维吾尔自治区', 'children': [{ 'code': '6501', 'name': '乌鲁木齐市' }, { 'code': '6502', 'name': '克拉玛依市' }, { 'code': '6504', 'name': '吐鲁番市' }, { 'code': '6505', 'name': '哈密市' }, { 'code': '6523', 'name': '昌吉回族自治州' }, { 'code': '6527', 'name': '博尔塔拉蒙古自治州' }, { 'code': '6528', 'name': '巴音郭楞蒙古自治州' }, { 'code': '6529', 'name': '阿克苏地区' }, { 'code': '6530', 'name': '克孜勒苏柯尔克孜自治州' }, { 'code': '6531', 'name': '喀什地区' }, { 'code': '6532', 'name': '和田地区' }, { 'code': '6540', 'name': '伊犁哈萨克自治州' }, { 'code': '6542', 'name': '塔城地区' }, { 'code': '6543', 'name': '阿勒泰地区' }, { 'code': '6590', 'name': '自治区直辖县级行政区划' }] }, { 'name': '台湾', 'code': '710000', 'children': [{ 'name': '台北市', 'code': '710100' }, { 'name': '高雄市', 'code': '710200' }, { 'name': '基隆市', 'code': '710300' }, { 'name': '台中市', 'code': '710400' }, { 'name': '台南市', 'code': '710500' }, { 'name': '新竹市', 'code': '710600' }, { 'name': '嘉义市', 'code': '710700' }, { 'name': '新北市', 'code': '710800' }, { 'name': '宜兰县', 'code': '712200' }, { 'name': '桃园县', 'code': '712300' }, { 'name': '新竹县', 'code': '712400' }, { 'name': '苗栗县', 'code': '712500' }, { 'name': '彰化县', 'code': '712700' }, { 'name': '南投县', 'code': '712800' }, { 'name': '云林县', 'code': '712900' }, { 'name': '嘉义县', 'code': '713000' }, { 'name': '屏东县', 'code': '713300' }, { 'name': '台东县', 'code': '713400' }, { 'name': '花莲县', 'code': '713500' }, { 'name': '澎湖县', 'code': '713600' }] }, { 'name': '香港特别行政区', 'code': '810000', 'children': [{ 'name': '香港岛', 'code': '810100' }, { 'name': '九龙', 'code': '810200' }, { 'name': '新界', 'code': '810300' }] }, { 'name': '澳门特别行政区', 'code': '820000', 'children': [{ 'name': '澳门半岛', 'code': '820100' }, { 'name': '氹仔岛', 'code': '820200' }, { 'name': '路环岛', 'code': '820300' }] }] 142 | return data 143 | } 144 | -------------------------------------------------------------------------------- /src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tccsg/dg-table/a5a2d4f8d948ef4b1e12fc04ba6dce5a9ff12339/src/assets/logo.png -------------------------------------------------------------------------------- /src/components/Gender.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 29 | 30 | 38 | 39 | -------------------------------------------------------------------------------- /src/components/HelloWorld.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 34 | 35 | 36 | 38 | -------------------------------------------------------------------------------- /src/components/MyCascader.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 30 | -------------------------------------------------------------------------------- /src/components/MyDatePicker.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 22 | 23 | -------------------------------------------------------------------------------- /src/components/myFilter/MyInput.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 30 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App.vue' 3 | import ElementUI from 'element-ui' 4 | import DGTable from '../lib' 5 | import { 6 | DgDatePicker, 7 | DgCascader, 8 | DgFilterWrap } from '../lib/packages' 9 | import 'element-ui/lib/theme-chalk/index.css' 10 | import '../lib/css/index.css' 11 | 12 | Vue.use(ElementUI) 13 | Vue.use(DGTable) 14 | Vue.component(DgDatePicker.name, DgDatePicker) 15 | Vue.component(DgCascader.name, DgCascader) 16 | Vue.component(DgFilterWrap.name, DgFilterWrap) 17 | Vue.config.productionTip = false 18 | 19 | new Vue({ 20 | render: h => h(App), 21 | }).$mount('#app') 22 | --------------------------------------------------------------------------------