py-test-components 1.0.1 → 1.0.2

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.
@@ -0,0 +1,48 @@
1
+ const path = require('path');
2
+ const { VueLoaderPlugin } = require('vue-loader');
3
+
4
+ const baseConfig = {
5
+ resolve: {
6
+ alias: {
7
+ 'vue$': 'vue/dist/vue.esm.js',
8
+ },
9
+ },
10
+ module: {
11
+ rules: [
12
+ { test: /\.vue$/, loader: 'vue-loader' },
13
+ { test: /\.css$/, use: ['style-loader', 'css-loader'] },
14
+ ],
15
+ },
16
+ plugins: [new VueLoaderPlugin()],
17
+ };
18
+
19
+ // UMD build
20
+ const umdConfig = {
21
+ ...baseConfig,
22
+ entry: './src/index.js',
23
+ output: {
24
+ filename: 'py-component.js',
25
+ path: path.resolve(__dirname, 'dist'),
26
+ library: 'PyComponent',
27
+ libraryTarget: 'umd',
28
+ globalObject: 'this',
29
+ },
30
+ };
31
+
32
+ // ESM build
33
+ const esmConfig = {
34
+ ...baseConfig,
35
+ entry: './src/index.js',
36
+ output: {
37
+ filename: 'py-component.esm.js',
38
+ path: path.resolve(__dirname, 'dist'),
39
+ library: {
40
+ type: 'module',
41
+ },
42
+ },
43
+ experiments: {
44
+ outputModule: true,
45
+ },
46
+ };
47
+
48
+ module.exports = [umdConfig, esmConfig];
@@ -0,0 +1,17 @@
1
+ 在当前文件夹下构建一个基于vue2+elementui的组件库,发布到npm仓库的名称为py-test-component
2
+ 使用时,安装 nm install py-test-component
3
+ vue2工程可以使用该组件,通过import { PyTable, PyWeather, initStore } from 'py-test-component/vue';即可按需导入使用
4
+ react工程也能够使用该组件库,并且使用时不需要额外的适配成本(无需安装vue和elementUI),通过import { PyTable, PyWeather, initStore } from 'py-test-component/react';即可按需导入使用
5
+ 每个组件都有一个
6
+
7
+ 功能要求:
8
+ 1、组件库包含两个组件:
9
+ 一个表格展示组件PyTable(只有一个传入参数propData);
10
+ 一个天气查询组件PyWheather(一个输入框输入城市、一个查询按钮发起查询、展示查询的天气情况)
11
+ 2、创建一个request.js封装post方法,使得组件库能够自行发送请求不受外部工程影响,请求使用fetch实现
12
+ 3、创建一个api.js,用来封装一些api请求,比如查询天气时的请求queryWheather,使用request.js里的post方法
13
+ 4、组件库有自己的全局store机制,使用Vue.observable实现,只需要简单实现get和set方法,在组件内部可以随时访问,但是外部工程无法访问
14
+ 5、在引用组件时暴露一个initStore()方法,外部工程可以传入一些参数,存储到组件库的全局store中
15
+
16
+
17
+ 实现越简洁清晰越好,不要过度设计
package/dist/react.js DELETED
@@ -1 +0,0 @@
1
- !function(e,n){"object"==typeof exports&&"object"==typeof module?module.exports=n(require("React")):"function"==typeof define&&define.amd?define(["React"],n):"object"==typeof exports?exports.PyComponentReact=n(require("React")):e.PyComponentReact=n(e.React)}(Object("undefined"!=typeof self?self:this),e=>(()=>{"use strict";var n={883(n){n.exports=e}},t={};function o(e){var r=t[e];if(void 0!==r)return r.exports;var i=t[e]={exports:{}};return n[e](i,i.exports,o),i.exports}o.n=e=>{var n=e&&e.__esModule?()=>e.default:()=>e;return o.d(n,{a:n}),n},o.d=(e,n)=>{for(var t in n)o.o(n,t)&&!o.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:n[t]})},o.o=(e,n)=>Object.prototype.hasOwnProperty.call(e,n);var r={};o.d(r,{default:()=>p});var i=o(883);const c="https://unpkg.com/element-ui/lib/theme-chalk/index.css";let a=!1,u=null;function d(){return new Promise(function(e,n){if("undefined"!=typeof window&&window.PyComponent)return u=window.PyComponent.initStore,void e(window.PyComponent);if("undefined"==typeof document)return void n(new Error("只能在浏览器环境中使用"));const t=document.createElement("script");t.src="/node_modules/py-test-components/dist/py-component.js",t.onload=function(){window.PyComponent?(u=window.PyComponent.initStore,e(window.PyComponent)):n(new Error("组件库加载失败"))},t.onerror=function(){const t=document.createElement("script");t.src="./dist/py-component.js",t.onload=function(){window.PyComponent?(u=window.PyComponent.initStore,e(window.PyComponent)):n(new Error("组件库加载失败"))},t.onerror=function(){n(new Error("无法加载组件库"))},document.head.appendChild(t)},document.head.appendChild(t)})}function f(e,n){return(0,i.forwardRef)(function(t,o){var r=t.propData,u=t.loading,f=t.onChange,p=t.onLoad,s=t.onError,l=t.onRefresh,m=t.onSelectionChange,h=t.onEdit,y=t.onDelete,w=t.onSizeChange,C=t.onPageChange,v={};for(var E in t)t.hasOwnProperty(E)&&!["propData","loading","onChange","onLoad","onError","onRefresh","onSelectionChange","onEdit","onDelete","onSizeChange","onPageChange"].includes(E)&&(v[E]=t[E]);var g=(0,i.useRef)(null),P=(0,i.useState)(!1),S=P[0],b=P[1];return(0,i.useEffect)(function(){"function"==typeof o?o(g.current):o&&(o.current=g.current)},[o]),(0,i.useEffect)(function(){!function(){if(a||"undefined"==typeof document)return;if(document.querySelector('link[href="'+c+'"]'))return void(a=!0);const e=document.createElement("link");e.rel="stylesheet",e.href=c,document.head.appendChild(e),a=!0}(),d().then(function(){b(!0)}).catch(function(e){console.error("[PyComponent] 加载失败:",e)})},[]),(0,i.useEffect)(function(){g.current&&S&&(g.current[n]=r)},[r,S,n]),(0,i.useEffect)(function(){var e=g.current;if(e&&S){var n={change:f,load:p,error:s,refresh:l,"selection-change":m,edit:h,delete:y,"size-change":w,"page-change":C};return Object.keys(n).forEach(function(t){var o=n[t];o&&e.addEventListener(t,o)}),function(){Object.keys(n).forEach(function(t){var o=n[t];o&&e.removeEventListener(t,o)})}}},[S,f,p,s,l,m,h,y,w,C]),S?(0,i.createElement)(e,{ref:g,...v}):u||(0,i.createElement)("div",{style:{padding:20,textAlign:"center"}},"加载中...")})}const p={PyTable:f("py-table","propData"),PyWeather:f("py-weather","propData"),initStore:function(e){return d().then(function(n){if(n.initStore)n.initStore(e);else{if(!u)throw new Error("initStore 不存在");u(e)}})}};return r.default})());
package/dist/vue.js DELETED
@@ -1 +0,0 @@
1
- !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("Vue")):"function"==typeof define&&define.amd?define(["Vue"],e):"object"==typeof exports?exports.PyComponentVue=e(require("Vue")):t.PyComponentVue=e(t.Vue)}(Object("undefined"!=typeof self?self:this),t=>(()=>{"use strict";var e={628(t,e,a){a.d(e,{A:()=>o});var n=a(601),i=a.n(n),r=a(314),s=a.n(r)()(i());s.push([t.id,"\n.py-table[data-v-f08eba9c] {\n width: 100%;\n}\n.table-card[data-v-f08eba9c] {\n margin-bottom: 20px;\n}\n.card-header[data-v-f08eba9c] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n}\n.title[data-v-f08eba9c] {\n font-size: 16px;\n font-weight: 500;\n}\n.pagination-wrapper[data-v-f08eba9c] {\n margin-top: 20px;\n text-align: right;\n}\n",""]);const o=s},96(t,e,a){a.d(e,{A:()=>o});var n=a(601),i=a.n(n),r=a(314),s=a.n(r)()(i());s.push([t.id,"\n.py-weather[data-v-457c781e] {\n width: 100%;\n max-width: 400px;\n}\n.weather-card[data-v-457c781e] {\n border-radius: 12px;\n overflow: hidden;\n box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1);\n}\n.loading-wrapper[data-v-457c781e],\n.error-wrapper[data-v-457c781e] {\n padding: 40px;\n text-align: center;\n color: #909399;\n}\n.error-wrapper i[data-v-457c781e] {\n font-size: 48px;\n color: #F56C6C;\n display: block;\n margin-bottom: 16px;\n}\n.loading-wrapper i[data-v-457c781e] {\n font-size: 32px;\n margin-right: 8px;\n}\n.weather-content[data-v-457c781e] {\n background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n color: white;\n padding: 24px;\n}\n.weather-header[data-v-457c781e] {\n display: flex;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 24px;\n}\n.location[data-v-457c781e] {\n display: flex;\n align-items: center;\n font-size: 18px;\n}\n.location i[data-v-457c781e] {\n margin-right: 8px;\n}\n.city[data-v-457c781e] {\n font-weight: 500;\n}\n.date[data-v-457c781e] {\n font-size: 14px;\n opacity: 0.9;\n}\n.weather-main[data-v-457c781e] {\n text-align: center;\n margin-bottom: 24px;\n}\n.temperature[data-v-457c781e] {\n display: flex;\n align-items: flex-start;\n justify-content: center;\n}\n.temp-value[data-v-457c781e] {\n font-size: 72px;\n font-weight: 300;\n line-height: 1;\n}\n.temp-unit[data-v-457c781e] {\n font-size: 24px;\n margin-top: 8px;\n opacity: 0.8;\n}\n.weather-desc[data-v-457c781e] {\n margin-top: 12px;\n font-size: 18px;\n opacity: 0.9;\n}\n.weather-desc i[data-v-457c781e] {\n font-size: 24px;\n margin-right: 8px;\n}\n.weather-details[data-v-457c781e] {\n display: flex;\n justify-content: space-around;\n padding: 16px 0;\n border-top: 1px solid rgba(255, 255, 255, 0.2);\n border-bottom: 1px solid rgba(255, 255, 255, 0.2);\n}\n.detail-item[data-v-457c781e] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n}\n.detail-item i[data-v-457c781e] {\n font-size: 20px;\n opacity: 0.8;\n}\n.detail-item .label[data-v-457c781e] {\n font-size: 12px;\n opacity: 0.7;\n}\n.detail-item .value[data-v-457c781e] {\n font-size: 14px;\n font-weight: 500;\n}\n.weather-forecast[data-v-457c781e] {\n margin-top: 16px;\n}\n.forecast-title[data-v-457c781e] {\n font-size: 14px;\n margin-bottom: 12px;\n opacity: 0.9;\n}\n.forecast-list[data-v-457c781e] {\n display: flex;\n justify-content: space-between;\n}\n.forecast-item[data-v-457c781e] {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n}\n.forecast-item .day[data-v-457c781e] {\n opacity: 0.8;\n}\n.forecast-item i[data-v-457c781e] {\n font-size: 20px;\n}\n.forecast-item .temp[data-v-457c781e] {\n opacity: 0.9;\n}\n",""]);const o=s},314(t){t.exports=function(t){var e=[];return e.toString=function(){return this.map(function(e){var a="",n=void 0!==e[5];return e[4]&&(a+="@supports (".concat(e[4],") {")),e[2]&&(a+="@media ".concat(e[2]," {")),n&&(a+="@layer".concat(e[5].length>0?" ".concat(e[5]):""," {")),a+=t(e),n&&(a+="}"),e[2]&&(a+="}"),e[4]&&(a+="}"),a}).join("")},e.i=function(t,a,n,i,r){"string"==typeof t&&(t=[[null,t,void 0]]);var s={};if(n)for(var o=0;o<this.length;o++){var c=this[o][0];null!=c&&(s[c]=!0)}for(var l=0;l<t.length;l++){var d=[].concat(t[l]);n&&s[d[0]]||(void 0!==r&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=r),a&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=a):d[2]=a),i&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=i):d[4]="".concat(i)),e.push(d))}},e}},601(t){t.exports=function(t){return t[1]}},72(t){var e=[];function a(t){for(var a=-1,n=0;n<e.length;n++)if(e[n].identifier===t){a=n;break}return a}function n(t,n){for(var r={},s=[],o=0;o<t.length;o++){var c=t[o],l=n.base?c[0]+n.base:c[0],d=r[l]||0,p="".concat(l," ").concat(d);r[l]=d+1;var h=a(p),u={css:c[1],media:c[2],sourceMap:c[3],supports:c[4],layer:c[5]};if(-1!==h)e[h].references++,e[h].updater(u);else{var f=i(u,n);n.byIndex=o,e.splice(o,0,{identifier:p,updater:f,references:1})}s.push(p)}return s}function i(t,e){var a=e.domAPI(e);return a.update(t),function(e){if(e){if(e.css===t.css&&e.media===t.media&&e.sourceMap===t.sourceMap&&e.supports===t.supports&&e.layer===t.layer)return;a.update(t=e)}else a.remove()}}t.exports=function(t,i){var r=n(t=t||[],i=i||{});return function(t){t=t||[];for(var s=0;s<r.length;s++){var o=a(r[s]);e[o].references--}for(var c=n(t,i),l=0;l<r.length;l++){var d=a(r[l]);0===e[d].references&&(e[d].updater(),e.splice(d,1))}r=c}}},659(t){var e={};t.exports=function(t,a){var n=function(t){if(void 0===e[t]){var a=document.querySelector(t);if(window.HTMLIFrameElement&&a instanceof window.HTMLIFrameElement)try{a=a.contentDocument.head}catch(t){a=null}e[t]=a}return e[t]}(t);if(!n)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");n.appendChild(a)}},540(t){t.exports=function(t){var e=document.createElement("style");return t.setAttributes(e,t.attributes),t.insert(e,t.options),e}},56(t,e,a){t.exports=function(t){var e=a.nc;e&&t.setAttribute("nonce",e)}},825(t){t.exports=function(t){if("undefined"==typeof document)return{update:function(){},remove:function(){}};var e=t.insertStyleElement(t);return{update:function(a){!function(t,e,a){var n="";a.supports&&(n+="@supports (".concat(a.supports,") {")),a.media&&(n+="@media ".concat(a.media," {"));var i=void 0!==a.layer;i&&(n+="@layer".concat(a.layer.length>0?" ".concat(a.layer):""," {")),n+=a.css,i&&(n+="}"),a.media&&(n+="}"),a.supports&&(n+="}");var r=a.sourceMap;r&&"undefined"!=typeof btoa&&(n+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(r))))," */")),e.styleTagTransform(n,t,e.options)}(e,t,a)},remove:function(){!function(t){if(null===t.parentNode)return!1;t.parentNode.removeChild(t)}(e)}}}},113(t){t.exports=function(t,e){if(e.styleSheet)e.styleSheet.cssText=t;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(t))}}},508(e){e.exports=t}},a={};function n(t){var i=a[t];if(void 0!==i)return i.exports;var r=a[t]={id:t,exports:{}};return e[t](r,r.exports,n),r.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var a in e)n.o(e,a)&&!n.o(t,a)&&Object.defineProperty(t,a,{enumerable:!0,get:e[a]})},n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),n.nc=void 0;var i={};n.d(i,{default:()=>O});var r=function(){var t=this,e=t._self._c;return e("div",{staticClass:"py-table"},[e("el-card",{staticClass:"table-card"},[e("div",{staticClass:"card-header",attrs:{slot:"header"},slot:"header"},[e("span",{staticClass:"title"},[t._v(t._s(t.config.title||"数据表格"))]),t._v(" "),e("div",{staticClass:"actions"},[!1!==t.config.showRefresh?e("el-button",{attrs:{type:"text",icon:"el-icon-refresh"},on:{click:t.refreshData}},[t._v("\n 刷新\n ")]):t._e()],1)]),t._v(" "),e("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.loading,expression:"loading"}],attrs:{data:t.tableData,stripe:!1!==t.config.stripe,border:!0===t.config.border,height:t.config.height},on:{"selection-change":t.handleSelectionChange}},[t.config.showSelection?e("el-table-column",{attrs:{type:"selection",width:"55"}}):t._e(),t._v(" "),!1!==t.config.showIndex?e("el-table-column",{attrs:{type:"index",label:"序号",width:"60"}}):t._e(),t._v(" "),t._l(t.columns,function(a){return e("el-table-column",{key:a.prop,attrs:{prop:a.prop,label:a.label,width:a.width,"min-width":a.minWidth,sortable:a.sortable},scopedSlots:t._u([{key:"default",fn:function(n){return[a.formatter?e("span",[t._v("\n "+t._s(a.formatter(n.row[a.prop],n.row))+"\n ")]):"date"===a.type?e("span",[t._v("\n "+t._s(t.formatDate(n.row[a.prop]))+"\n ")]):"status"===a.type?e("span",[e("el-tag",{attrs:{type:t.getStatusType(n.row[a.prop])}},[t._v("\n "+t._s(n.row[a.prop])+"\n ")])],1):e("span",[t._v("\n "+t._s(n.row[a.prop])+"\n ")])]}}],null,!0)})}),t._v(" "),!1!==t.config.showActions?e("el-table-column",{attrs:{label:"操作",width:"150",fixed:"right"},scopedSlots:t._u([{key:"default",fn:function(a){return[e("el-button",{attrs:{type:"text",size:"small"},on:{click:function(e){return t.handleEdit(a.row)}}},[t._v("\n 编辑\n ")]),t._v(" "),e("el-button",{attrs:{type:"text",size:"small"},on:{click:function(e){return t.handleDelete(a.row)}}},[t._v("\n 删除\n ")])]}}],null,!1,3347720758)}):t._e()],2),t._v(" "),!1!==t.config.pagination?e("div",{staticClass:"pagination-wrapper"},[e("el-pagination",{attrs:{"current-page":t.currentPage,"page-size":t.pageSize,"page-sizes":[10,20,50,100],total:t.total,layout:"total, sizes, prev, pager, next, jumper"},on:{"size-change":t.handleSizeChange,"current-change":t.handlePageChange}})],1):t._e()],1)],1)};r._withStripped=!0;var s=n(508),o=n.n(s);const c=o().observable({apiKey:"",baseUrl:"",userInfo:null}),l={get:t=>c[t],set(t,e){c[t]=e},setMultiple(t){Object.assign(c,t)},subscribe:t=>o().watch(()=>c,(e,a)=>{t(e,a)},{deep:!0}),getState:()=>c},d={baseURL:"",timeout:1e4,headers:{"Content-Type":"application/json"}};function p(t,e={}){const a={...d,...e,headers:{...d.headers,...e.headers}},n=a.baseURL?`${a.baseURL}${t}`:t,i=new AbortController,r=setTimeout(()=>i.abort(),a.timeout);return fetch(n,{...a,signal:i.signal}).then(t=>{if(clearTimeout(r),!t.ok)throw new Error(`HTTP error! status: ${t.status}`);const e=t.headers.get("content-type");return e&&e.includes("application/json")?t.json():t.text()}).catch(t=>{if(clearTimeout(r),"AbortError"===t.name)throw new Error("Request timeout");throw t})}function h(t,e={},a={}){const n=Object.keys(e).map(t=>`${encodeURIComponent(t)}=${encodeURIComponent(e[t])}`).join("&");return p(n?`${t}?${n}`:t,{method:"GET",...a})}function u(){return l.get("baseUrl")||""}function f(){const t=l.get("apiKey")||"";return t?{"X-API-Key":t}:{}}const v=t=>h("/api/weather",{city:t},{baseURL:u(),headers:f()}),g=t=>h("/api/weather/forecast",{city:t},{baseURL:u(),headers:f()}),m=(t={})=>h("/api/table/data",t,{baseURL:u(),headers:f()}),y={name:"PyTable",props:{propData:{default:null}},data:()=>({tableData:[],loading:!1,currentPage:1,pageSize:10,total:0,selectedRows:[]}),computed:{config(){return this.propData||{}},columns(){return this.config.columns||[]}},mounted(){this.loadData();const t=l.get("baseUrl");t&&console.log("[PyTable] baseUrl from store:",t)},methods:{async loadData(){if(this.config.data)return this.tableData=this.config.data,void(this.total=this.tableData.length);if(!1!==this.config.api)try{this.loading=!0;const t={page:this.currentPage,size:this.pageSize,...this.config.params},e=await m(t),a=this.config.dataPath||"data",n=this.config.totalPath||"total";this.tableData=this.getPathValue(e,a)||[],this.total=this.getPathValue(e,n)||0}catch(t){console.error("[PyTable] 加载数据失败:",t),this.$message.error("加载数据失败")}finally{this.loading=!1}},getPathValue:(t,e)=>e.split(".").reduce((t,e)=>t&&t[e],t),refreshData(){this.currentPage=1,this.loadData(),this.$emit("refresh")},handleSizeChange(t){this.pageSize=t,this.loadData(),this.$emit("size-change",t)},handlePageChange(t){this.currentPage=t,this.loadData(),this.$emit("page-change",t)},handleSelectionChange(t){this.selectedRows=t,this.$emit("selection-change",t)},handleEdit(t){this.$emit("edit",t)},handleDelete(t){this.$emit("delete",t)},formatDate:t=>t?new Date(t).toLocaleDateString("zh-CN"):"",getStatusType:t=>({active:"success",pending:"warning",disabled:"info",error:"danger"}[t]||"")}};var w=n(72),b=n.n(w),_=n(825),x=n.n(_),C=n(659),D=n.n(C),S=n(56),z=n.n(S),P=n(540),T=n.n(P),j=n(113),$=n.n(j),A=n(628),k={};function R(t,e,a,n,i,r,s,o){var c,l="function"==typeof t?t.options:t;if(e&&(l.render=e,l.staticRenderFns=a,l._compiled=!0),n&&(l.functional=!0),r&&(l._scopeId="data-v-"+r),s?(c=function(t){(t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),i&&i.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(s)},l._ssrRegister=c):i&&(c=o?function(){i.call(this,(l.functional?this.parent:this).$root.$options.shadowRoot)}:i),c)if(l.functional){l._injectStyles=c;var d=l.render;l.render=function(t,e){return c.call(e),d(t,e)}}else{var p=l.beforeCreate;l.beforeCreate=p?[].concat(p,c):[c]}return{exports:t,options:l}}k.styleTagTransform=$(),k.setAttributes=z(),k.insert=D().bind(null,"head"),k.domAPI=x(),k.insertStyleElement=T(),b()(A.A,k),A.A&&A.A.locals&&A.A.locals;const E=R(y,r,[],!1,null,"f08eba9c",null).exports;var I=function(){var t=this,e=t._self._c;return e("div",{staticClass:"py-weather"},[e("el-card",{staticClass:"weather-card",attrs:{"body-style":{padding:"0px"}}},[t.loading?e("div",{staticClass:"loading-wrapper"},[e("i",{staticClass:"el-icon-loading"}),t._v(" "),e("span",[t._v("加载天气数据...")])]):t.error?e("div",{staticClass:"error-wrapper"},[e("i",{staticClass:"el-icon-warning-outline"}),t._v(" "),e("span",[t._v(t._s(t.error))]),t._v(" "),e("el-button",{attrs:{type:"text"},on:{click:t.loadWeather}},[t._v("重试")])],1):e("div",{staticClass:"weather-content"},[e("div",{staticClass:"weather-header"},[e("div",{staticClass:"location"},[e("i",{staticClass:"el-icon-location"}),t._v(" "),e("span",{staticClass:"city"},[t._v(t._s(t.displayCity))])]),t._v(" "),e("div",{staticClass:"date"},[t._v(t._s(t.currentDate))])]),t._v(" "),e("div",{staticClass:"weather-main"},[e("div",{staticClass:"temperature"},[e("span",{staticClass:"temp-value"},[t._v(t._s(t.weatherData.temperature))]),t._v(" "),e("span",{staticClass:"temp-unit"},[t._v("°C")])]),t._v(" "),e("div",{staticClass:"weather-desc"},[e("i",{class:t.weatherIcon}),t._v(" "),e("span",[t._v(t._s(t.weatherData.description))])])]),t._v(" "),e("div",{staticClass:"weather-details"},[e("div",{staticClass:"detail-item"},[e("i",{staticClass:"el-icon-moisture"}),t._v(" "),e("span",{staticClass:"label"},[t._v("湿度")]),t._v(" "),e("span",{staticClass:"value"},[t._v(t._s(t.weatherData.humidity)+"%")])]),t._v(" "),e("div",{staticClass:"detail-item"},[e("i",{staticClass:"el-icon-wind-power"}),t._v(" "),e("span",{staticClass:"label"},[t._v("风速")]),t._v(" "),e("span",{staticClass:"value"},[t._v(t._s(t.weatherData.windSpeed)+" km/h")])]),t._v(" "),e("div",{staticClass:"detail-item"},[e("i",{staticClass:"el-icon-view"}),t._v(" "),e("span",{staticClass:"label"},[t._v("能见度")]),t._v(" "),e("span",{staticClass:"value"},[t._v(t._s(t.weatherData.visibility)+" km")])])]),t._v(" "),t.config.showForecast&&t.forecast.length>0?e("div",{staticClass:"weather-forecast"},[e("div",{staticClass:"forecast-title"},[t._v("未来预报")]),t._v(" "),e("div",{staticClass:"forecast-list"},t._l(t.forecast,function(a,n){return e("div",{key:n,staticClass:"forecast-item"},[e("span",{staticClass:"day"},[t._v(t._s(a.day))]),t._v(" "),e("i",{class:t.getWeatherIcon(a.weather)}),t._v(" "),e("span",{staticClass:"temp"},[t._v(t._s(a.low)+"° - "+t._s(a.high)+"°")])])}),0)]):t._e()])])],1)};I._withStripped=!0;const U={name:"PyWeather",props:{propData:{default:null}},data:()=>({loading:!1,error:"",weatherData:{temperature:"--",description:"--",humidity:"--",windSpeed:"--",visibility:"--"},forecast:[]}),computed:{config(){return this.propData||{}},displayCity(){return this.config.city||this.weatherData.city||"北京"},currentDate:()=>(new Date).toLocaleDateString("zh-CN",{year:"numeric",month:"long",day:"numeric",weekday:"long"}),weatherIcon(){return{晴:"el-icon-sunny",多云:"el-icon-cloudy-and-sunny",阴:"el-icon-cloudy",雨:"el-icon-heavy-rain",雪:"el-icon-light-snow",雾:"el-icon-foggy",霾:"el-icon-foggy"}[this.weatherData.description]||"el-icon-sunny"}},mounted(){this.loadWeather()},watch:{"config.city":{handler(){this.loadWeather()}}},methods:{async loadWeather(){if(this.config.mockData)return this.weatherData={...this.config.mockData},void(this.config.forecast&&(this.forecast=this.config.forecast));try{this.loading=!0,this.error="";const t=this.config.city||"北京",e=await v(t);if(this.weatherData={city:t,temperature:e.temperature||25,description:e.weather||"晴",humidity:e.humidity||60,windSpeed:e.windSpeed||10,visibility:e.visibility||10,...e},this.config.showForecast){const e=await g(t);this.forecast=e.data||this.getDefaultForecast()}this.$emit("load",this.weatherData)}catch(t){console.error("[PyWeather] 加载天气失败:",t),this.error="获取天气数据失败",this.$emit("error",t)}finally{this.loading=!1}},getDefaultForecast:()=>["明天","后天","周三","周四","周五"].map(t=>({day:t,weather:"晴",high:28,low:18})),getWeatherIcon:t=>({晴:"el-icon-sunny",多云:"el-icon-cloudy-and-sunny",阴:"el-icon-cloudy",雨:"el-icon-heavy-rain",雪:"el-icon-light-snow"}[t]||"el-icon-sunny")}};var L=n(96),V={};V.styleTagTransform=$(),V.setAttributes=z(),V.insert=D().bind(null,"head"),V.domAPI=x(),V.insertStyleElement=T(),b()(L.A,V),L.A&&L.A.locals&&L.A.locals;const O={PyTable:E,PyWeather:R(U,I,[],!1,null,"457c781e",null).exports,initStore:function(t){t&&"object"==typeof t?(Object.keys(t).forEach(e=>{l.set(e,t[e])}),console.log("[PyComponent] Store 已初始化")):console.warn("[PyComponent] initStore 需要传入配置对象")}};return i.default})());