hookehuyr

✨ feat: 完善显示结构,新增主题色控制

1 { 1 {
2 - "name": "temple_material_request", 2 + "name": "custom-table",
3 - "description": "西园寺物资申请系统", 3 + "description": "自定义表格",
4 "version": "1.0.0", 4 "version": "1.0.0",
5 "scripts": { 5 "scripts": {
6 "dev": "vite", 6 "dev": "vite",
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
36 }, 36 },
37 "dependencies": { 37 "dependencies": {
38 "@dedisuryadi/json-form-data": "^0.1.1", 38 "@dedisuryadi/json-form-data": "^0.1.1",
39 + "@element-plus/icons-vue": "^2.3.1",
39 "@tinymce/tinymce-vue": "4.0.7", 40 "@tinymce/tinymce-vue": "4.0.7",
40 "@vant/area-data": "^1.3.1", 41 "@vant/area-data": "^1.3.1",
41 "@vant/touch-emulator": "^1.4.0", 42 "@vant/touch-emulator": "^1.4.0",
...@@ -82,6 +83,7 @@ ...@@ -82,6 +83,7 @@
82 "pinia": "^2.0.14", 83 "pinia": "^2.0.14",
83 "postcss-px-to-viewport": "^1.1.1", 84 "postcss-px-to-viewport": "^1.1.1",
84 "qs": "^6.10.3", 85 "qs": "^6.10.3",
86 + "sass": "^1.78.0",
85 "tslint": "^6.1.3", 87 "tslint": "^6.1.3",
86 "unplugin-auto-import": "^0.8.8", 88 "unplugin-auto-import": "^0.8.8",
87 "unplugin-vue-components": "^0.23.0", 89 "unplugin-vue-components": "^0.23.0",
......
1 +
2 +@forward 'element-plus/theme-chalk/src/common/var.scss' with (
3 + $colors: (
4 + 'white': #ffffff,
5 + 'black': #000000,
6 + 'primary': (
7 + 'base': #C2915F,
8 + ),
9 + 'success': (
10 + 'base': #67c23a,
11 + ),
12 + 'warning': (
13 + 'base': #e6a23c,
14 + ),
15 + 'danger': (
16 + 'base': #f56c6c,
17 + ),
18 + 'error': (
19 + 'base': #f56c6c,
20 + ),
21 + 'info': (
22 + 'base': #909399,
23 + ),
24 + ),
25 +);
26 +
27 +// 这句非常重要
28 +@use "element-plus/theme-chalk/src/index.scss" as *;
...@@ -2,27 +2,35 @@ ...@@ -2,27 +2,35 @@
2 * @Author: hookehuyr hookehuyr@gmail.com 2 * @Author: hookehuyr hookehuyr@gmail.com
3 * @Date: 2022-05-31 12:06:19 3 * @Date: 2022-05-31 12:06:19
4 * @LastEditors: hookehuyr hookehuyr@gmail.com 4 * @LastEditors: hookehuyr hookehuyr@gmail.com
5 - * @LastEditTime: 2024-09-06 17:39:52 5 + * @LastEditTime: 2024-09-09 13:54:11
6 * @FilePath: /custom_table/src/main.js 6 * @FilePath: /custom_table/src/main.js
7 * @Description: 7 * @Description:
8 */ 8 */
9 import { createApp } from 'vue'; 9 import { createApp } from 'vue';
10 import router from './router'; 10 import router from './router';
11 import ElementPlus from 'element-plus' 11 import ElementPlus from 'element-plus'
12 -import 'element-plus/dist/index.css' 12 +// import 'element-plus/dist/index.css'
13 +import '@/assets/styles/element.scss' // 这是我的样式路径
14 +import zhCn from 'element-plus/es/locale/lang/zh-cn'
15 +import 'dayjs/locale/zh-cn'
13 import App from './App.vue'; 16 import App from './App.vue';
14 // import axios from './utils/axios'; 17 // import axios from './utils/axios';
15 import axios from '@/utils/axios'; 18 import axios from '@/utils/axios';
16 // import 'default-passive-events'; // 解决Chrome控制台non-passive event listener输出问题 19 // import 'default-passive-events'; // 解决Chrome控制台non-passive event listener输出问题
17 import { createPinia } from 'pinia'; 20 import { createPinia } from 'pinia';
21 +import * as ElementPlusIconsVue from '@element-plus/icons-vue'
18 22
19 const pinia = createPinia(); 23 const pinia = createPinia();
20 const app = createApp(App); 24 const app = createApp(App);
21 25
26 +for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
27 + app.component(key, component)
28 +}
29 +
22 // 屏蔽警告信息 30 // 屏蔽警告信息
23 app.config.warnHandler = () => null; 31 app.config.warnHandler = () => null;
24 32
25 app.config.globalProperties.$http = axios; // 关键语句 33 app.config.globalProperties.$http = axios; // 关键语句
26 34
27 -app.use(pinia).use(router).use(ElementPlus) 35 +app.use(pinia).use(router).use(ElementPlus, { locale: zhCn })
28 app.mount('#app'); 36 app.mount('#app');
......
1 <!-- 1 <!--
2 * @Date: 2024-07-23 10:34:37 2 * @Date: 2024-07-23 10:34:37
3 * @LastEditors: hookehuyr hookehuyr@gmail.com 3 * @LastEditors: hookehuyr hookehuyr@gmail.com
4 - * @LastEditTime: 2024-09-06 17:35:34 4 + * @LastEditTime: 2024-09-09 13:57:21
5 * @FilePath: /custom_table/src/views/index.vue 5 * @FilePath: /custom_table/src/views/index.vue
6 * @Description: 文件描述 6 * @Description: 文件描述
7 --> 7 -->
8 <template> 8 <template>
9 - <el-table :data="tableData" style="width: 100%"> 9 + <div style="padding: 1rem;">
10 + <el-row justify="space-between">
11 + <el-col :span="12">
12 + <div>
13 + <el-button type="primary" :icon="Plus">添加</el-button>&nbsp;
14 + <el-icon style="vertical-align: middle"><Download /></el-icon>&nbsp;<span style="vertical-align: middle">导入</span>&nbsp;
15 + <el-icon style="vertical-align: middle"><Upload /></el-icon>&nbsp;<span style="vertical-align: middle">导出</span>&nbsp;
16 + <el-icon style="vertical-align: middle"><Delete /></el-icon>&nbsp;<span style="vertical-align: middle">删除</span>
17 + </div>
18 + </el-col>
19 + <el-col :span="12" style="text-align: right;">
20 + <el-input
21 + v-model="input3"
22 + style="width: 200px"
23 + placeholder="搜索数据"
24 + :prefix-icon="Search"
25 + />
26 + &nbsp;
27 + <el-popover :visible="visible" placement="bottom">
28 + 123
29 + <span @click="visible = false">关闭</span>
30 + <template #reference>
31 + <div class="tooltip-container">
32 + <el-icon style="vertical-align: middle" @click="visible = true"><Filter /></el-icon>
33 + <span class="tooltip-text">筛选条件</span>
34 + </div>
35 + </template>
36 + </el-popover>
37 + &nbsp;
38 + <el-tooltip
39 + class="box-item"
40 + effect="dark"
41 + content="显示字段"
42 + placement="bottom"
43 + >
44 + <el-icon style="vertical-align: middle"><Operation /></el-icon>
45 + </el-tooltip>
46 + &nbsp;
47 + <el-tooltip
48 + class="box-item"
49 + effect="dark"
50 + content="排序"
51 + placement="bottom"
52 + >
53 + <el-icon style="vertical-align: middle"><Sort /></el-icon>
54 + </el-tooltip>
55 + &nbsp;
56 + <el-tooltip
57 + class="box-item"
58 + effect="dark"
59 + content="刷新"
60 + placement="bottom"
61 + >
62 + <el-icon style="vertical-align: middle"><Refresh /></el-icon>
63 + </el-tooltip>
64 + &nbsp;
65 + </el-col>
66 + </el-row>
67 + <el-table
68 + :data="tableData" stripe border height="780"
69 + style="width: 100%; margin: 1rem 0;"
70 + @selection-change="handleSelectionChange"
71 + >
72 + <el-table-column type="selection" width="55" />
10 <el-table-column prop="date" label="Date" width="180" /> 73 <el-table-column prop="date" label="Date" width="180" />
11 <el-table-column prop="name" label="Name" width="180" /> 74 <el-table-column prop="name" label="Name" width="180" />
12 <el-table-column prop="address" label="Address" /> 75 <el-table-column prop="address" label="Address" />
13 </el-table> 76 </el-table>
77 + <el-row justify="space-between">
78 + <el-col :span="8">
79 + <el-pagination
80 + v-model:current-page="currentPage4"
81 + v-model:page-size="pageSize4"
82 + :page-sizes="[100, 200, 300, 400]"
83 + :size="size"
84 + layout="total, sizes"
85 + :total="400"
86 + @size-change="handleSizeChange"
87 + @current-change="handleCurrentChange"
88 + />
89 + </el-col>
90 + <el-col :span="8">
91 + <el-pagination
92 + v-model:current-page="currentPage4"
93 + v-model:page-size="pageSize4"
94 + :size="size"
95 + layout="prev, pager, next"
96 + :total="400"
97 + @size-change="handleSizeChange"
98 + @current-change="handleCurrentChange"
99 + />
100 + </el-col>
101 + <el-col :span="8">
102 + <el-pagination
103 + v-model:current-page="currentPage4"
104 + v-model:page-size="pageSize4"
105 + :size="size"
106 + layout="jumper"
107 + :total="400"
108 + @size-change="handleSizeChange"
109 + @current-change="handleCurrentChange"
110 + style="display: flex; justify-content: end;"
111 + />
112 + </el-col>
113 + </el-row>
114 + </div>
14 </template> 115 </template>
15 116
16 <script setup> 117 <script setup>
17 import { ref } from 'vue' 118 import { ref } from 'vue'
18 import { useRoute, useRouter } from 'vue-router' 119 import { useRoute, useRouter } from 'vue-router'
19 - 120 +import { Plus, Download, Upload, Search } from '@element-plus/icons-vue'
20 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js' 121 import { Cookies, $, _, axios, storeToRefs, mainStore, Toast, useTitle } from '@/utils/generatePackage.js'
21 //import { } from '@/utils/generateModules.js' 122 //import { } from '@/utils/generateModules.js'
22 //import { } from '@/utils/generateIcons.js' 123 //import { } from '@/utils/generateIcons.js'
...@@ -25,31 +126,76 @@ const $route = useRoute(); ...@@ -25,31 +126,76 @@ const $route = useRoute();
25 const $router = useRouter(); 126 const $router = useRouter();
26 useTitle($route.meta.title); 127 useTitle($route.meta.title);
27 128
28 -const tableData = [ 129 +const tableData = ref([])
29 - { 130 +
30 - date: '2016-05-03', 131 +const visible = ref(false);
31 - name: 'Tom', 132 +
32 - address: 'No. 189, Grove St, Los Angeles', 133 +const multipleSelection = ref([])
33 - }, 134 +const handleSelectionChange = (val) => {
34 - { 135 + multipleSelection.value = val
35 - date: '2016-05-02', 136 + console.log("🚀 ~ file: index.vue:136 ~ handleSelectionChange ~ multipleSelection.value:", multipleSelection.value);
36 - name: 'Tom', 137 +}
37 - address: 'No. 189, Grove St, Los Angeles', 138 +
38 - }, 139 +onMounted(() => {
39 - { 140 + for (let index = 0; index < 50; index++) {
40 - date: '2016-05-04', 141 + tableData.value.push({
41 - name: 'Tom', 142 + id: index,
42 - address: 'No. 189, Grove St, Los Angeles',
43 - },
44 - {
45 date: '2016-05-01', 143 date: '2016-05-01',
46 name: 'Tom', 144 name: 'Tom',
47 address: 'No. 189, Grove St, Los Angeles', 145 address: 'No. 189, Grove St, Los Angeles',
48 - }, 146 + })
49 -] 147 + }
148 +})
149 +
150 +const currentPage4 = ref(4)
151 +const pageSize4 = ref(100)
152 +
153 +const handleSizeChange = (val) => {
154 + console.log(`${val} items per page`)
155 +}
156 +const handleCurrentChange = (val) => {
157 + console.log(`current page: ${val}`)
158 +}
50 159
51 </script> 160 </script>
52 161
53 <style lang="less" scoped> 162 <style lang="less" scoped>
163 +.tooltip-container {
164 + position: relative;
165 + display: inline-block;
166 + cursor: pointer; /* 悬停时显示手形指针 */
167 +}
168 +
169 +.tooltip-text {
170 + font-size: 0.8rem;
171 + visibility: hidden;
172 + background-color: black;
173 + color: #fff;
174 + text-align: center;
175 + border-radius: 5px;
176 + padding: 5px 10px;
177 + position: absolute;
178 + z-index: 10;
179 + top: 125%; /* 使 tooltip 位于触发元素下方 */
180 + left: 50%;
181 + transform: translateX(-50%);
182 + opacity: 0;
183 + transition: opacity 0.3s;
184 + white-space: nowrap; /* 防止文字换行 */
185 + &::after {
186 + content: "";
187 + position: absolute;
188 + top: -10px; /* 三角形放在 Tooltip 上方 */
189 + left: 50%;
190 + transform: translateX(-50%);
191 + border-width: 5px;
192 + border-style: solid;
193 + border-color: transparent transparent black transparent; /* 创建黑色的小三角形 */
194 + }
195 +}
54 196
197 +.tooltip-container:hover .tooltip-text {
198 + visibility: visible;
199 + opacity: 1;
200 +}
55 </style> 201 </style>
......
...@@ -1185,6 +1185,21 @@ chokidar@3.5.3, chokidar@^3.5.3: ...@@ -1185,6 +1185,21 @@ chokidar@3.5.3, chokidar@^3.5.3:
1185 optionalDependencies: 1185 optionalDependencies:
1186 fsevents "~2.3.2" 1186 fsevents "~2.3.2"
1187 1187
1188 +"chokidar@>=3.0.0 <4.0.0":
1189 + version "3.6.0"
1190 + resolved "https://mirrors.cloud.tencent.com/npm/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b"
1191 + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==
1192 + dependencies:
1193 + anymatch "~3.1.2"
1194 + braces "~3.0.2"
1195 + glob-parent "~5.1.2"
1196 + is-binary-path "~2.1.0"
1197 + is-glob "~4.0.1"
1198 + normalize-path "~3.0.0"
1199 + readdirp "~3.6.0"
1200 + optionalDependencies:
1201 + fsevents "~2.3.2"
1202 +
1188 chownr@^2.0.0: 1203 chownr@^2.0.0:
1189 version "2.0.0" 1204 version "2.0.0"
1190 resolved "https://mirrors.cloud.tencent.com/npm/chownr/-/chownr-2.0.0.tgz" 1205 resolved "https://mirrors.cloud.tencent.com/npm/chownr/-/chownr-2.0.0.tgz"
...@@ -2227,6 +2242,11 @@ image-size@~0.5.0: ...@@ -2227,6 +2242,11 @@ image-size@~0.5.0:
2227 resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz" 2242 resolved "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz"
2228 integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w= 2243 integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
2229 2244
2245 +immutable@^4.0.0:
2246 + version "4.3.7"
2247 + resolved "https://mirrors.cloud.tencent.com/npm/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381"
2248 + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==
2249 +
2230 indent-string@^4.0.0: 2250 indent-string@^4.0.0:
2231 version "4.0.0" 2251 version "4.0.0"
2232 resolved "https://mirrors.cloud.tencent.com/npm/indent-string/-/indent-string-4.0.0.tgz" 2252 resolved "https://mirrors.cloud.tencent.com/npm/indent-string/-/indent-string-4.0.0.tgz"
...@@ -3271,6 +3291,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1: ...@@ -3271,6 +3291,15 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
3271 resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 3291 resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
3272 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 3292 integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
3273 3293
3294 +sass@^1.78.0:
3295 + version "1.78.0"
3296 + resolved "https://mirrors.cloud.tencent.com/npm/sass/-/sass-1.78.0.tgz#cef369b2f9dc21ea1d2cf22c979f52365da60841"
3297 + integrity sha512-AaIqGSrjo5lA2Yg7RvFZrlXDBCp3nV4XP73GrLGvdRWWwk+8H3l0SDvq/5bA4eF+0RFPLuWUk3E+P1U/YqnpsQ==
3298 + dependencies:
3299 + chokidar ">=3.0.0 <4.0.0"
3300 + immutable "^4.0.0"
3301 + source-map-js ">=0.6.2 <2.0.0"
3302 +
3274 sax@^1.2.4: 3303 sax@^1.2.4:
3275 version "1.2.4" 3304 version "1.2.4"
3276 resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" 3305 resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz"
...@@ -3396,6 +3425,11 @@ snake-case@^3.0.4: ...@@ -3396,6 +3425,11 @@ snake-case@^3.0.4:
3396 dot-case "^3.0.4" 3425 dot-case "^3.0.4"
3397 tslib "^2.0.3" 3426 tslib "^2.0.3"
3398 3427
3428 +"source-map-js@>=0.6.2 <2.0.0":
3429 + version "1.2.1"
3430 + resolved "https://mirrors.cloud.tencent.com/npm/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
3431 + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
3432 +
3399 source-map-js@^1.0.2: 3433 source-map-js@^1.0.2:
3400 version "1.0.2" 3434 version "1.0.2"
3401 resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" 3435 resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz"
......