byt-ui 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/demo.html ADDED
@@ -0,0 +1 @@
1
+ <!doctype html><meta charset="utf-8"><title>byt-ui demo</title><script src="./byt-ui.umd.js"></script><link rel="stylesheet" href="./byt-ui.css"><script>console.log(byt-ui)</script>
package/package.json ADDED
@@ -0,0 +1,69 @@
1
+ {
2
+ "name": "byt-ui",
3
+ "version": "0.0.5",
4
+ "private": false,
5
+ "description": "byt组件库",
6
+ "author": {
7
+ "name": "wgh"
8
+ },
9
+ "scripts": {
10
+ "dev": "vue-cli-service serve",
11
+ "build": "vue-cli-service build",
12
+ "lint": "vue-cli-service lint",
13
+ "lib": "vue-cli-service build --target lib --name byt-ui --dest lib packages/index.js",
14
+ "styleguide": "vue-cli-service styleguidist",
15
+ "styleguide:build": "vue-cli-service styleguidist:build"
16
+ },
17
+ "main": "lib/byt-ui.umd.min.js",
18
+ "dependencies": {
19
+ "core-js": "^3.8.3",
20
+ "element-ui": "^2.15.10",
21
+ "moment": "^2.29.4",
22
+ "vue": "^2.6.14",
23
+ "vxe-table": "^3.6.6",
24
+ "xe-utils": "^3.5.6"
25
+ },
26
+ "devDependencies": {
27
+ "@babel/core": "^7.12.16",
28
+ "@babel/eslint-parser": "^7.12.16",
29
+ "@vue/cli-plugin-babel": "~5.0.0",
30
+ "@vue/cli-plugin-eslint": "~5.0.0",
31
+ "@vue/cli-service": "~5.0.0",
32
+ "eslint": "^7.32.0",
33
+ "eslint-plugin-vue": "^8.0.3",
34
+ "node-sass": "4.14.1",
35
+ "sass-loader": "10.0.4",
36
+ "vue-cli-plugin-styleguidist": "~4.45.1",
37
+ "vue-template-compiler": "^2.6.14"
38
+ },
39
+ "eslintConfig": {
40
+ "root": true,
41
+ "env": {
42
+ "node": true
43
+ },
44
+ "extends": [
45
+ "plugin:vue/essential",
46
+ "eslint:recommended"
47
+ ],
48
+ "parserOptions": {
49
+ "parser": "@babel/eslint-parser"
50
+ },
51
+ "rules": {}
52
+ },
53
+ "browserslist": [
54
+ "> 1%",
55
+ "last 2 versions",
56
+ "not dead"
57
+ ],
58
+ "keywords": [
59
+ "byt",
60
+ "byt-ui",
61
+ "@byt",
62
+ "@byt/base"
63
+ ],
64
+ "license": "MIT",
65
+ "publishConfig": {
66
+ "access": "public",
67
+ "registry": "https://registry.npmjs.org/"
68
+ }
69
+ }
@@ -0,0 +1,10 @@
1
+ /*
2
+ * @Description:
3
+ * @Author: 王国火
4
+ * @Date: 2022-09-19 10:17:14
5
+ * @LastEditTime: 2022-09-19 10:17:22
6
+ * @LastEditors: 王国火
7
+ */
8
+ export default{
9
+
10
+ }
@@ -0,0 +1,49 @@
1
+ <!--
2
+ * @Description:
3
+ * @Author: 王国火
4
+ * @Date: 2022-09-14 16:24:51
5
+ * @LastEditTime: 2022-09-15 10:33:25
6
+ * @LastEditors: 王国火
7
+ -->
8
+ ### columns项配置
9
+ | 字段 |字段类型| 说明 |默认值|可选参数|
10
+ | ---- |----| ---- |----|----|
11
+ | minWidth |number| 最小宽度 |--|--|
12
+ | fixed |string| 列固定定位 |--|left/right|
13
+ | sortable |boolean| 排序 |false|true/false|
14
+ | showOverflow |boolean/string| 溢出显示类型 |false|ellipsis/title/tooltip|
15
+ | type |string| 类型 |--|seq/checkbox|
16
+ | key |string| 字段名 |--|--|
17
+ | width |number| 宽度 |--|--|
18
+ | label |string| 显示表头 |--|--|
19
+ | align |string| 对齐方式 |--|left/center/right|
20
+ | slot |string| 使用自定义插槽 |--|--|
21
+
22
+
23
+ ### pagination配置
24
+ | 字段 |字段类型| 说明 |默认值|可选参数|
25
+ | --- |----| ---- |----|----|
26
+ | page |number| 分页页码 |1|--|
27
+ | pageSize |number| 分页展示条数 |20|--|
28
+ | total |number| 总条数 |0|--|
29
+ | pageSizes |array| 分页页码条数选择 |[20, 50, 100, 200, 500]|--|
30
+
31
+ ### searchList项配置
32
+ | 字段 |字段类型| 说明 |默认值|可选参数|
33
+ | --- |----| ---- |----|----|
34
+ | type |string| 组件类型 |input|input/cascader/select/datepicker/daterange|
35
+ | label |string| 搜索条件展示文字 |--|--|
36
+ | key |string| 搜索字段 |--|--|
37
+ | options |array| select、cascader数据源 |[]|--|
38
+ | props |object|[cascader配置项,详见官方文档](https://element.eleme.cn/#/zh-CN/component/cascader) |--|--|
39
+ | fields |string|datepicker对应颗粒度 |date|date/year/month/week|
40
+ <br><br>
41
+
42
+
43
+
44
+ ### 组件示例
45
+ ```[import](./demo.vue)
46
+ 引入示例代码
47
+ ```
48
+
49
+
@@ -0,0 +1,83 @@
1
+ <template>
2
+ <div class="demo" v-loading="loading">
3
+ <basic-view
4
+ :search-list="searchList"
5
+ :fetch="getTableData"
6
+ :table-data="tableData"
7
+ :columns="columns"
8
+ :pagination="pagination"
9
+ ref="baseView"
10
+ >
11
+ <template #btns>
12
+ <el-button type="primary" icon="el-icon-plus">新增</el-button>
13
+ </template>
14
+
15
+ <template #actions>
16
+ <el-button type="text" icon="el-icon-edit">编辑</el-button>
17
+ <el-button type="text" class="el-button-delete" icon="el-icon-delete">删除</el-button>
18
+ </template>
19
+ </basic-view>
20
+ </div>
21
+ </template>
22
+
23
+ <script>
24
+ export default {
25
+ name: 'demo',
26
+ components: {},
27
+ data() {
28
+ return {
29
+ searchList: [
30
+ {
31
+ label: '用户名',
32
+ key: 'username',
33
+ type: 'input'
34
+ }
35
+ ],
36
+ tableData: [],
37
+ columns: [
38
+ { label: '头像', slot: 'avatar', fixed: 'left' },
39
+ { label: '用户名', key: 'username', fixed: 'left' },
40
+ { label: '姓名', key: 'name' },
41
+ { label: '手机号', key: 'phone' },
42
+ { label: '昵称', key: 'nickname' },
43
+ { label: '邮箱', key: 'email' },
44
+ { label: '状态', slot: 'lockFlag' },
45
+ { label: '创建时间', key: 'createTime' },
46
+ { label: '操作', key: 'actions', slot: 'actions', width: 160, fixed: 'right' }
47
+ ],
48
+ loading: false,
49
+ pagination: {
50
+ total: 0
51
+ }
52
+ }
53
+ },
54
+ created() {},
55
+ methods: {
56
+ // 主动调用组件刷新
57
+ onRefresh() {
58
+ this.$refs.baseView.refresh();
59
+ },
60
+ // 主动调用组件搜索
61
+ onSearch() {
62
+ this.$refs.baseView.onSearch();
63
+ },
64
+ getTableData({ params, pagination }) {
65
+ const {
66
+ page,
67
+ pageSize
68
+ } = pagination;
69
+ console.log(page, pageSize)
70
+ // 实际请求业务逻辑
71
+ },
72
+ refreshChange() {
73
+ this.$refs.baseView.refresh();
74
+ }
75
+ }
76
+ }
77
+
78
+ </script>
79
+ <style lang='scss' scoped>
80
+ .demo{
81
+ height: 600px;
82
+ }
83
+ </style>
@@ -0,0 +1,331 @@
1
+ <!--
2
+ * @Description:
3
+ * @Author: 王国火
4
+ * @Date: 2022-07-12 17:47:20
5
+ * @LastEditTime: 2022-09-19 10:23:41
6
+ * @LastEditors: 王国火
7
+ -->
8
+
9
+ <template>
10
+ <div class="basic-view">
11
+ <div class="search-view" v-if="searchList.length">
12
+ <!-- 搜索表单列表 -->
13
+ <FormView
14
+ ref="search"
15
+ inline
16
+ :search-list="searchList"
17
+ @search="onSearch"
18
+ @reset="onReset"
19
+ v-model="searchForm"
20
+ ></FormView>
21
+ </div>
22
+
23
+ <div class="action-view">
24
+ <!-- @slot 预留按钮插槽 -->
25
+ <slot name="btns"></slot>
26
+ </div>
27
+
28
+ <!-- 表格主体部分,使用第三方vxe-table -->
29
+ <div class="table-view" style="width: 100%;overflow: hidden;">
30
+ <vxe-table
31
+ border
32
+ stripe
33
+ max-height="100%"
34
+ :data="tableData"
35
+ @checkbox-all="onSelectAllEvent"
36
+ @checkbox-change="onSelectChangeEvent"
37
+ :column-config="{resizable: true}"
38
+ :row-config="{isCurrent: true, isHover: true}"
39
+ :show-overflow="showOverflow"
40
+ >
41
+ <template v-for="(column,index) in columns">
42
+ <vxe-column
43
+ :fixed="column.fixed"
44
+ v-if="column.type=='seq'"
45
+ type="seq"
46
+ width="60"
47
+ :align="column.align||'center'"
48
+ :key="index"
49
+ ></vxe-column>
50
+ <vxe-column
51
+ v-else-if="column.type=='checkbox'"
52
+ type="checkbox"
53
+ width="60"
54
+ :align="column.align||'center'"
55
+ :key="index"
56
+ ></vxe-column>
57
+ <vxe-column
58
+ :fixed="column.fixed"
59
+ v-else-if="column.slot"
60
+ :width="column.width||'auto'"
61
+ :title="column.label"
62
+ :align="column.align||'center'"
63
+ :key="index"
64
+ >
65
+ <template #default="scope">
66
+ <!--
67
+ @slot 表格列 column 预留按钮插槽
68
+ @binding {string} name 插槽名
69
+ @binding {object} scope 表格行数据
70
+ @binding {object} column 表格列配置
71
+ -->
72
+ <slot :name="column.slot" :scope="scope" :column="column">
73
+ <span>{{ scope.row[column.key] }}</span>
74
+ </slot>
75
+ </template>
76
+ </vxe-column>
77
+
78
+ <!-- 列主要配置 -->
79
+ <vxe-column
80
+ :min-width="column.minWidth"
81
+ :fixed="column.fixed"
82
+ :sortable="column.sortable"
83
+ :show-overflow="column.showOverflow"
84
+ :type="column.type"
85
+ v-else
86
+ :field="column.key"
87
+ :width="column.width||'auto'"
88
+ :title="column.label"
89
+ :align="column.align||'center'"
90
+ :key="index"
91
+ ></vxe-column>
92
+ </template>
93
+
94
+ <template #empty>
95
+ <el-empty description="暂无数据!">
96
+ <el-button type="primary" @click="onSearch">重试</el-button>
97
+ </el-empty>
98
+ </template>
99
+ </vxe-table>
100
+ </div>
101
+
102
+ <!-- 分页配置 -->
103
+ <div class="pagination" v-if="pagination">
104
+ <el-pagination
105
+ background
106
+ @size-change="onSizeChange"
107
+ @current-change="onPageChange"
108
+ :current-page="pageOpt.page"
109
+ :page-sizes="pageOpt.pageSizes"
110
+ :page-size="pageOpt.pageSize"
111
+ layout="total, sizes, prev, pager, next, jumper"
112
+ :total="pageOpt.total"
113
+ >
114
+ </el-pagination>
115
+ </div>
116
+ </div>
117
+ </template>
118
+
119
+ <script>
120
+ import FormView from '../form-view/index.vue'
121
+ /**
122
+ * 通用表格组件
123
+ * @displayName BaseView
124
+ * @example ./BaseView.md
125
+ * @see {@link https://vxetable.cn/v3/#/table/base/basic}
126
+ * @see {@link https://element.eleme.cn/#/zh-CN/component/installation}
127
+ */
128
+ export default {
129
+ name: 'BaseView',
130
+ props: {
131
+ /** 搜索行内表单配置*/
132
+ searchList: {
133
+ type: Array,
134
+ default() {
135
+ return []
136
+ }
137
+ },
138
+ /** 调用表格数据请求的方法*/
139
+ fetch: {
140
+ type: Function,
141
+ default: () => {}
142
+ },
143
+ /** 是否自动调用fetch请求,部分场景下不需要自动调用*/
144
+ autoLoad: {
145
+ type: Boolean,
146
+ default: true
147
+ },
148
+ /** 表格数据*/
149
+ tableData: {
150
+ type: Array,
151
+ required: true,
152
+ default() {
153
+ return []
154
+ }
155
+ },
156
+ /** 表格列配置*/
157
+ columns: {
158
+ type: Array,
159
+ required: true,
160
+ default() {
161
+ return []
162
+ }
163
+ },
164
+ /** 分页配置,默认没有分页*/
165
+ pagination: {
166
+ type: [Boolean, Object],
167
+ default: false
168
+ },
169
+ /**
170
+ * 整体配置是否单元格溢出显示省略号
171
+ * @values ellipsis, title, tooltip
172
+ */
173
+ showOverflow: {
174
+ type: [String, Boolean],
175
+ default: false
176
+ }
177
+ },
178
+ components: {
179
+ FormView
180
+ },
181
+ data() {
182
+ return {
183
+ searchForm: {},
184
+ pageOpt: {
185
+ page: 1,
186
+ pageSize: 20,
187
+ total: 0,
188
+ pageSizes: [20, 50, 100, 200, 500]
189
+ }
190
+ }
191
+ },
192
+ mounted() {
193
+ // 有些特殊情况需要手动请求列表数据
194
+ if (this.autoLoad) this.fetchData();
195
+ },
196
+ methods: {
197
+ onSelectAllEvent(list) {
198
+ /** 多选框全选触发
199
+ * @event checkbox-all
200
+ * @type {Change}
201
+ * @property {array} list 选中的列表项
202
+ */
203
+ this.$emit('checkbox-all', list)
204
+ },
205
+ onSelectChangeEvent(list) {
206
+ /** 多选框选择项变化触发
207
+ * @event checkbox-change
208
+ * @type {Change}
209
+ * @property {array} list 选中的列表项
210
+ */
211
+ this.$emit('checkbox-change', list)
212
+ },
213
+ /**
214
+ * 初始化请求列表数据
215
+ * @param {params,pagination}
216
+ * @public
217
+ */
218
+ fetchData() {
219
+ const { page, pageSize } = this.pageOpt;
220
+ const params = {
221
+ params: this.searchForm,
222
+ pagination: {
223
+ page,
224
+ pageSize
225
+ }
226
+ }
227
+ this.fetch(params)
228
+ },
229
+ /**
230
+ * 搜索
231
+ * @param {params}
232
+ * @public
233
+ */
234
+ onSearch() {
235
+ this.fetchData();
236
+ },
237
+ /**
238
+ * 刷新列表
239
+ * @param {params}
240
+ * @public
241
+ */
242
+ refresh() {
243
+ this.pageOpt.page = 1;
244
+ this.fetchData();
245
+ },
246
+ /**
247
+ * 重置搜索条件
248
+ * @param {params}
249
+ * @public
250
+ */
251
+ onReset() {
252
+ this.pageOpt.page = 1;
253
+ this.searchForm = {};
254
+ this.fetchData();
255
+ },
256
+ onSizeChange(size) {
257
+ this.pageOpt.pageSize = size;
258
+ this.pageOpt.page = 1;
259
+ this.$nextTick(() => {
260
+ this.fetchData();
261
+ })
262
+ },
263
+ onPageChange(page) {
264
+ this.pageOpt.page = page;
265
+ this.$nextTick(() => {
266
+ this.fetchData();
267
+ })
268
+ },
269
+ initForm(list) {
270
+ list.map(v => {
271
+ if (v.value || v.value == 0) {
272
+ this.$set(this.searchForm, v.key, v.value)
273
+ }
274
+ })
275
+ }
276
+ },
277
+ watch: {
278
+ pagination: {
279
+ handler(val) {
280
+ if (val) {
281
+ this.pageOpt = Object.assign(this.pageOpt, val)
282
+ }
283
+ },
284
+ immediate: true,
285
+ deep: true
286
+ },
287
+ searchList: {
288
+ handler(val) {
289
+ this.initForm(val)
290
+ },
291
+ immediate: true,
292
+ deep: true
293
+ }
294
+ }
295
+ }
296
+ </script>
297
+
298
+ <style lang="scss" scoped>
299
+ .basic-view{
300
+ height: 100%;
301
+ overflow: hidden;
302
+ padding:10px;
303
+ background-color: #fff;
304
+ border-radius: 6px;
305
+ box-sizing: border-box;
306
+ display: flex;
307
+ flex-direction: column;
308
+ .action-view{
309
+ &>*{
310
+ margin-bottom: 10px;
311
+ }
312
+ }
313
+ .table-view{
314
+ flex:1;
315
+ overflow: hidden;
316
+ ::v-deep{
317
+ .vxe-custom--option .vxe-checkbox--icon:before, .vxe-export--panel-column-option .vxe-checkbox--icon:before, .vxe-table--filter-option .vxe-checkbox--icon:before, .vxe-table--render-default .vxe-cell--checkbox .vxe-checkbox--icon:before{
318
+ border-width: 1px;
319
+ }
320
+ .vxe-table--render-default.border--full .vxe-body--column, .vxe-table--render-default.border--full .vxe-footer--column, .vxe-table--render-default.border--full .vxe-header--column{
321
+ padding:6px 0;
322
+ }
323
+ }
324
+ }
325
+ .pagination{
326
+ text-align: right;
327
+ margin-top: 10px;
328
+ }
329
+ }
330
+ </style>
331
+