ol-base-components 1.3.1 → 1.5.0

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/README.md CHANGED
@@ -19,8 +19,10 @@ npm install ol-base-components
19
19
 
20
20
  ## 使用说明
21
21
 
22
- 在您的 Vue 项目中,您需要在入口文件(通常是 `main.js` 或 `app.js`)中导入并使用该组件库:
22
+ - **基本用法**:通用常规组件,ol-table ol-search ol-dialogTemplate
23
+ - **带 Swagger 支持的用法**:适用于需要从 Swagger API 获取数据的场景。通过传入 `swaggerUrl` 和 `successSwaggerCallback`,可以在成功获取 Swagger 数据后初始化 Vue 实例。
23
24
 
25
+ ### 1. 基本用法
24
26
  ```javascript
25
27
  // main.js
26
28
  import Vue from "vue";
@@ -35,6 +37,29 @@ new Vue({
35
37
  }).$mount("#app");
36
38
  ```
37
39
 
40
+ ### 2. 带 Swagger 支持的用法
41
+ ```javascript
42
+ // main.js
43
+ import Vue from "vue";
44
+ import App from "./App.vue";
45
+ import OlBaseComponents from "ol-base-components"; // 导入组件库
46
+
47
+ // 使用组件库
48
+ Vue.use(OlBaseComponents, {
49
+ swaggerUrl: "http://192.168.xxx.xxx:20019/swagger/v1/swagger.json",
50
+ successSwaggerCallback: () => {
51
+ new Vue({
52
+ el: "#app",
53
+ router,
54
+ store,
55
+ i18n,
56
+ render: h => h(App)
57
+ });
58
+ }
59
+ });
60
+ ```
61
+
62
+
38
63
  ## 组件示例
39
64
 
40
65
  ### 搜索框组件
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ol-base-components",
3
- "version": "1.3.1",
3
+ "version": "1.5.0",
4
4
  "private": false,
5
5
  "main": "src/package/index.js",
6
6
  "scripts": {
@@ -115,6 +115,64 @@ const components = [OlTable, OlSearch, Dialog];
115
115
  const SWAGGER_DATA_KEY = "swaggerData"; // 存储 Swagger 数据的键
116
116
  let isLoggedIn = false; // 用于跟踪用户登录状态
117
117
 
118
+ // 自定义加载指示器
119
+ function showLoading() {
120
+ // 创建样式
121
+ const style = document.createElement("style");
122
+ style.innerHTML = `
123
+ @keyframes spin {
124
+ 0% { transform: rotate(0deg); }
125
+ 100% { transform: rotate(360deg); }
126
+ }
127
+ #loading-spinner {
128
+ width: 50px; /* 调整大小 */
129
+ height: 50px; /* 调整大小 */
130
+ border: 8px solid rgba(255, 255, 255, 0.3);
131
+ border-top: 8px solid #a8c8e0; /* 与背景色协调的颜色 */
132
+ border-radius: 50%;
133
+ animation: spin 1s linear infinite; /* 添加旋转动画 */
134
+ margin-bottom: 10px; /* 图标和文本之间的间距 */
135
+ }
136
+ #loading {
137
+ background: linear-gradient(135deg, #a8c8e0, #f0f4f8); /* 更柔和的渐变背景 */
138
+ color: #333; /* 文本颜色 */
139
+ }
140
+ `;
141
+ document.head.appendChild(style);
142
+
143
+ // 创建加载指示器
144
+ const loadingDiv = document.createElement("div");
145
+ loadingDiv.id = "loading";
146
+ loadingDiv.style.position = "fixed";
147
+ loadingDiv.style.top = "0";
148
+ loadingDiv.style.left = "0";
149
+ loadingDiv.style.width = "100%";
150
+ loadingDiv.style.height = "100%";
151
+ loadingDiv.style.display = "flex"; // 使用 flexbox
152
+ loadingDiv.style.flexDirection = "column"; // 设置为上下排列
153
+ loadingDiv.style.justifyContent = "center"; // 垂直居中
154
+ loadingDiv.style.alignItems = "center"; // 水平居中
155
+
156
+ // 创建旋转的加载图标
157
+ const spinner = document.createElement("div");
158
+ spinner.id = "loading-spinner";
159
+ loadingDiv.appendChild(spinner);
160
+
161
+ // 添加文本
162
+ const loadingText = document.createElement("div");
163
+ loadingText.innerText = "初始化数据中,请耐心等待...";
164
+ loadingDiv.appendChild(loadingText);
165
+
166
+ document.body.appendChild(loadingDiv);
167
+ }
168
+
169
+ function hideLoading() {
170
+ const loadingDiv = document.getElementById("loading");
171
+ if (loadingDiv) {
172
+ document.body.removeChild(loadingDiv);
173
+ }
174
+ }
175
+
118
176
  const install = async function (
119
177
  Vue,
120
178
  options = {
@@ -126,7 +184,6 @@ const install = async function (
126
184
  components.map((item) => {
127
185
  Vue.component(`ol-${item.name}`, item);
128
186
  });
129
-
130
187
  // 检查登录状态
131
188
  const isLoggedIn = getLoginStatus();
132
189
 
@@ -163,6 +220,7 @@ const install = async function (
163
220
 
164
221
  // 用户未登录或缓存数据不存在,重新请求 Swagger 数据
165
222
  try {
223
+ showLoading();
166
224
  const client = await SwaggerClient(options.swaggerUrl);
167
225
  const swaggerData = client.spec; // 获取 Swagger 数据
168
226
  await storeData(swaggerData); // 缓存数据到 IndexedDB
@@ -173,6 +231,7 @@ const install = async function (
173
231
  typeof options.successSwaggerCallback === "function"
174
232
  ) {
175
233
  options.successSwaggerCallback();
234
+ hideLoading();
176
235
  }
177
236
  } catch (error) {
178
237
  console.error("获取 Swagger 数据失败:", error);
@@ -404,9 +404,21 @@ export default {
404
404
  methods: {
405
405
  init() {
406
406
  const swaggerColumns = this.$swagger.specification.paths[this.url].get.responses["200"].content['application/json'].schema.properties.items.items.properties
407
- swaggerColumns.forEach(item => {
408
- const tempItem = this.tableData.columns.find((e) => e.prop == item.prop)
409
- tempItem ? tempItem = { ...item, ...tempItem } : this.tableData.columns.push(item)
407
+
408
+ Object.keys(swaggerColumns).forEach(key => {
409
+ const item = swaggerColumns[key]
410
+ let tempItem = this.tableData.columns.find((e) => e.prop == key)
411
+ if (tempItem) {
412
+ tempItem = { ...item, ...tempItem }
413
+ } else if (item.description) {
414
+ this.tableData.columns.push({
415
+ prop: key,
416
+ label: item.description,
417
+ show: true,
418
+ sortable: false,
419
+ attrs: {}
420
+ })
421
+ }
410
422
  })
411
423
 
412
424
  // 一定加上selection,通过show显示隐藏