# NSwagStudio二版 **Repository Path**: vue_project__joe/nswag-studio-2nd-edition ## Basic Information - **Project Name**: NSwagStudio二版 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-02-21 - **Last Updated**: 2025-02-21 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ### 组织介绍 请描述组织的定位/愿景 ## 项目框架地址 ``` https://gitee.com/star_ring/product_architecture.git[跳转](https://gitee.com/star_ring/product_architecture.git) ``` 详情说明[跳转](https://gitee.com/star_ring/nswag-studio-2nd-edition) ### 项目架构说明 + 严格按照Ts来书写项目及组件,减少使用any定义 + 字体为思源字体 + SourceHanSansCN-Regular 正常字体 + SourceHanSansCN-Medium 加粗字体 + 代码压缩 compression-webpack-plugin + 配置文件 baseConfig.json 相关的基本配置数据 + 接口工具 利用Nswage工具依据swagger.json生成 + 工具地址[仓库地址](https://gitee.com/star_ring/nswag-studio-2nd-edition.git) + vue-kst-auth 封装的授权npm包 + vue-router + vuex + element-ui + vue-property-decorator + axios ## 目录结构 ``` |—— public |—— baseConfig.json // 接本配置 |—— src |—— assets |—— exports // 导出web组件文件夹 |—— plugins // 插件、接口等 |—— router // 路由 |—— store |—— baseData.ts // 基本数据 |—— views | App.vue ``` ### vue+ts组件结构 ``` ``` ### 正在使用的项目组件(web components) + [作业流程分组管理组件,使用查看wiki](https://gitee.com/star_ring/work_flow/wikis) + [资产模型项目,详情查看,wiki](https://gitee.com/star_ring/asset_model/wikis) + [公共数据,详情查看,wiki](https://gitee.com/star_ring/public_data/wikis) + [基础数据,实时数据,详情查看,wiki](https://gitee.com/star_ring/common_data/wikis) + [知识库,详情查看;wiki](https://gitee.com/star_ring/repository/wikis) + [作业审核,详情查看,wiki](https://gitee.com/star_ring/job_audit/wikis) + [审批,详情查看,wiki](https://gitee.com/star_ring/approval/wikis) + [消息中心,详情查看,wiki](https://gitee.com/star_ring/message-center/wikis) + [快速工单,详情查看,wiki](https://gitee.com/star_ring/work_order_system/wikis) + [自定义表单文档](https://mrhj.gitee.io/form-generator/#/) ### 代码片段 #### 浏览器导出PDF,打印 [详情查看wiki](https://gitee.com/star_ring/nswag-studio-2nd-edition/wikis/%E5%AF%BC%E5%87%BAPDF%EF%BC%8C%E4%BD%BF%E7%94%A8%E6%B5%8F%E8%A7%88%E5%99%A8%E8%87%AA%E5%B8%A6%E7%9A%84%E6%89%93%E5%8D%B0%E5%8A%9F%E8%83%BD?sort_id=4352928) #### 登录组件、http请求错误提醒组件 ``` ``` #### 阿里图标转换 1. 外网转发,内网依据转发下载css文件 ``` ``` #### 定时刷新执行 ``` /** * 定时执行 * 入参是目标时间的小时数,取值0-23,当然可以根据需要拓展成分钟数,这里主要是提供思路所以从简 * 初次进入的时候,计算当前时间和目标时间的距离,执行一次setTimeout(func,距离时间),第二次开始,把setTimeOut的时候设置成24小时 * targetHour: 小时,minutes: 分钟 */ setRegular(targetHour: number, minutes: number | undefined = 0) { /** 判断是否已超过今日目标小时,若超过,时间间隔设置为距离明天目标小时的距离 */ let timeInterval = 0; /** 当前时间 */ const nowTime = new Date(); /** 计算当前时间的秒数 */ let nowSeconds = 0; /** 计算目标时间对应的秒数 */ let targetSeconds = 0; nowSeconds = nowTime.getHours() * 3600 + nowTime.getMinutes() * 60 + nowTime.getSeconds(); targetSeconds = targetHour * 3600 + minutes * 60; timeInterval = targetSeconds > nowSeconds ? targetSeconds - nowSeconds : targetSeconds + 24 * 3600 - nowSeconds; setTimeout(this.updateDate, timeInterval * 1000); } /** 每天定时刷新日期更新数据 */ updateDate() { this.reloadLayout(); //之后每天调用一次 setTimeout(this.updateDate, 24 * 3600 * 1000); } ``` #### 获取两个日期间,每天字符串 ``` ts代码 /** 获取两个日期间,每天的日期 */ function formatEveryDay(start: any, end: any) { let dateList = []; var startTime = getDate(start); var endTime = getDate(end); while (endTime.getTime() - startTime.getTime() >= 0) { var year = startTime.getFullYear(); var month = startTime.getMonth() + 1 < 10 ? "0" + (startTime.getMonth() + 1) : startTime.getMonth() + 1; var day = startTime.getDate().toString().length == 1 ? "0" + startTime.getDate() : startTime.getDate(); dateList.push(year + "-" + month + "-" + day); startTime.setDate(startTime.getDate() + 1); } return dateList; } function getDate(datestr: any) { var temp = datestr.split("-"); var date = new Date(temp[0], temp[1] - 1, temp[2]); return date; } export { formatEveryDay }; ``` ### 上传文件 引入npm包 ``` import { _axios, baseConfig } from "vue-kst-auth"; ``` ``` 上传数据 /** 文件上传成功 */ handleAvatarSuccess() {} /** 计算属性 */ /** 获取headers */ get headers() { return { __tenant: baseConfig.getCookie("__tenant"), Authorization: "Bearer " + baseConfig.getCookie("Abp.AuthToken") }; } ``` #### js创建a便签,下载文件 ``` /** 创建下载链接 */ const downloadHref = ""; /** 创建a标签并为其添加属性 */ let downloadLink = document.createElement("a"); downloadLink.href = downloadHref; downloadLink.download = "资产与3D视图模板.xlsx"; /** 触发点击事件执行下载 */ downloadLink.click(); /** 下载完成进行释放 */ window.URL.revokeObjectURL(downloadHref); ``` ### js通过token头部信息,获取文件流,下载文件 ``` /** 下载导入模板 */ downloadfileTem() { var xhr = new XMLHttpRequest(); var formData = new FormData(); xhr.open("get", "/tai-zhang/api/asset-management/download-asset-template"); //url填写后台的接口地址,如果是post,在formData append参数(参考原文地址) xhr.setRequestHeader("__tenant", baseConfig.getCookie("__tenant")); xhr.setRequestHeader( "Authorization", "Bearer " + baseConfig.getCookie("Abp.AuthToken") ); xhr.responseType = "blob"; xhr.onload = function(e) { if (this.status == 200) { var blob = this.response; /** 创建下载链接 */ // const downloadHref = // "/tai-zhang/api/asset-management/download-asset-template"; const downloadHref = window.URL.createObjectURL(blob); /** 创建a标签并为其添加属性 */ let downloadLink = document.createElement("a"); downloadLink.href = downloadHref; downloadLink.download = `台帐模板${Date.now()}.xlsx`; /** 触发点击事件执行下载 */ downloadLink.click(); /** 下载完成进行释放 */ window.URL.revokeObjectURL(downloadHref); } }; xhr.send(formData); } ``` ### 动态引入文件 ``` // 动态加载引用文件 let files = this.$store.getters.getBaseData("files"); let files_keys = Object.keys(files); let heatStr = document.getElementsByTagName("head")[0].innerHTML; files_keys.forEach((cur, index) => { let src = files[cur]; if (src && /\.css$/.test(src.toString())) { heatStr += ``; } if (src && /\.ico$/.test(src.toString())) { heatStr += ``; } }); document.getElementsByTagName("head")[0].innerHTML = heatStr; ``` ### 获取二级域名 ``` /** 获取二级域名 */ getOrginName() { /** 获取当前域名切割 */ const hostnameList: string[] = window.location.hostname .split(".") .reverse(); if ( hostnameList.length > 2 && this.state.kpiList.includes(hostnameList[2]) ) { this.state.kpiName = hostnameList[2]; } else { this.state.kpiName = "ebc"; } } ``` ### 动态引入组件 ``` const resComponents: any = {}; const FormComponents = require.context( "@/components/FormList", false, /\.vue$/ ); FormComponents.keys().forEach(fileName => { const comp = FormComponents(fileName); resComponents[fileName.replace(/^\.\/(.*)\.\w+$/, "$1")] = comp.default; }); ``` ``` @Component({ components: { ...resComponents } }) ``` ### 获取基础数据 ``` document.write( ` 2、 /** 实时数据 */ connection = $.hubConnection(this.htjnYb, { useDefaultPath: false }); // 注销实时数据 this.connection.stop(); this.connection.start().done(function() { console.log("链接成功"); }); var contosoChatHubProxy = this.connection.createHubProxy("MessagingHub"); contosoChatHubProxy.on("receive", (res: ITagData) => { //接收数据 }) // this.$message.success("开始连接"); // 实时数据(资产标签) this.connection .start({ transport: ["webSockets", "longPolling"] }) .done((res: any) => { // this.$message.success("连接成功"); }); ``` ### 如何加入 请发送申请邮件至 ### 捐助 如果您觉得我们的开源软件对你有所帮助,请扫下方二维码打赏我们一杯咖啡。 ### 联系 网站: Follow @aaa on Weibo 邮箱: