工作常用代码

232 阅读5分钟

🌈layui

📄接口调用

🔥post方式

$.ajax({
	type: "POST",
	url: "/flowable/node/operateList",
	data: JSON.stringify(dataObj),
	contentType: "application/json",
	success: function (res) {
		console.log("res___",res);
	}
})

🔥get方式

$.get("/member/menu/tree?type=1", function (res) {
    
	//...
})

🌈uniapp小程序

📄接口调用

🔥post方式

// 传统post
let param = {"entity": {"cruser": this.nickName},"pager": {"current": 1,"size": 99}};
uni.request({
	url: baseUrl + "/tlujy/jmetathumbsup/listing",
	data: JSON.stringify(param),
	method: "POST",
	header: {'Content-Type': 'application/json'}
}).then((result) => {
	let [err, res] = result;
	console.log("打印", res);
})

// uni.$u.http  文档:https://www.uviewui.com/js/http.html
let httpData = {
	entity: {userid: this.userInfo.id, throughType: this.activeName},
	pager: {
		current: 1,
		size: 10,
		sortProps: [{
			"key": "crtime",
			"value": false
		}]
	}
}
uni.$u.http.post(baseUrl + '/SX/jmetasxzgsfqthroughlist/listing', httpData).then(res => {
	console.log("res", res);
})

🔥get方式

// 传统get
uni.request({
	url:baseUrl+ "/media/appexcellent/follow/"+this.userID ,
	method:"GET",
}).then((result)=>{
	let [err,res]=result;
	console.log("打印", res); 
})

//uni.$u.http
uni.$u.http.get(baseUrl + '/SX/sxzgsfqcompany/' + id).then(res => {
    //...
}).catch(err => {})

🔥delete方式

//删除单个
uni.request({
	url: baseUrl + "/tlujy/xinwencomment/" + id,
	method: "delete",
}).then((result) => {
	let [err, res] = result;
	console.log('删除信息',res)
})

// 删除多个
uni.request({
	url: baseUrl + "/tlujy/material/real/{ids}/batch".replace('{ids}',_this.checkedArr), //选中的id存进checkedArr
	method:'DELETE',
	header: {'content-type': 'application/json'},
	success: (res) => {
		_this.getImage() //重新获取图片
		uni.showToast({title:'删除成功!'})
	}
});

📄uni-app微信小程序保持登录状态

流程:首页为未登录状态 => 进行登录 => 首页状态改变 => 退出应用再次进入仍然是已登录状态。

Vuex:使用 vuex 进行管理登陆状态和保存用户信息

1. 根目录新建store/index.js

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

const store = new Vuex.Store({
	state: {
        // 是否登录标识
		hasLogin: false,
        // 账号信息
		userInfo: {}
	},
	mutations: {
        //登录
		login(state, userInfo) {
			state.hasLogin = true
            // 从一个或多个源对象复制到目标对象, 相同属性会被覆盖
			state.userInfo = Object.assign({}, state.userInfo, userInfo);
            
            //将用户信息保存在本地
            uni.setStorageSync('userInfo', state.userInfo)
		},
        //退出登录
		logout(state) {
            state.userInfo = {}
			state.hasLogin = false
			uni.removeStorageSync('userInfo')
		}
	}
})

export default store

2. main.js配置

import App from './App'
import Vue from 'vue'
import uView from '@/uni_modules/uview-ui'
import store from './store/index.js' // 1.导入store

Vue.use(uView)
Vue.config.productionTip = false
App.mpType = 'app'

Vue.prototype.$store = store // 2.vuex

const app = new Vue({
	store, // 3.使用
    ...App
})
app.$mount()

3. login中使用vuex

在 login.vue(登录页面)输入用户名密码后,调用接口进行登录,登录成功后调用 vuex 的方法改变应用的登陆状态。

<script>  
    import { mapMutations } from 'vuex';  
    export default {
        methods: {
            ...mapMutations(['login']),
            onSubmit() {  
                // 手机号密码登录
                let httpData = {"name": this.phone,"passWord": this.password};
                uni.$u.http.post(baseUrl + '/member/home/wxbackAjaxLogin', httpData).then(res => {
                    if (res.data.success) {
                        // 登录成功后改变vuex的状态
                        let userInfo = {"mspToken": res.data.mspToken,"id": res.data.userid}
                        this.login(userInfo)
						
                        //跳转首页
                        uni.switchTab({
                       		url: '/pages/index/index'
                        })
                    }
                });  
            },
        }  
    }  
</script>

4. 改变首页状态

在index.vue中,通过 vuex 中保存的 hasLogin 判断是否是登录状态,从而显示不同的内容。

<template>
	<view class="page">
		<view v-if="!hasLogin">现在是未登录状态,点击按钮进行登录</view>
		<view v-else>现在是登录状态,您的用户id是:{{userInfo.userName}}</view>
		<button type="primary" @click="bindLogin">{{hasLogin ? '退出登录' : '登录'}}</button>
	</view>
</template>
<script>
	import {
		mapState,
		mapMutations
	} from 'vuex';
	export default {
		computed: {
			...mapState(['hasLogin', 'userInfo'])
		},
		methods: {
			...mapMutations(['logout']),
			bindLogin() {
				if (this.hasLogin) {
					this.logout()
				} else {
					uni.navigateTo({
						url: '/pages/login/login'
					})
				}
			}
		}
	}
</script>

<style>
	.page{
		padding: 50upx 30upx;
	}
	view{
		line-height: 1.5;
		font-size: 32upx;
	}
	button{
		margin-top: 30upx;
		height: 80upx;
		line-height: 80upx;
	}
</style>

5. 再次进入应用

在 App.vue 中判断是否保存用户信息 "userInfo",如果保存则认为是登录状态,未保存则为未登录状态。

App.vue 中得到用户信息后需要同步改变 vuex 的状态,使所有页面都能共享登陆状态与用户信息。

<script>  
    import { mapMutations } from 'vuex';  
    export default {  
        onLaunch: function () {
            //获取保存在本地的用户信息
            let userInfo = uni.getStorageSync('userInfo');
            if(userInfo.id) {
                //更新登录状态 这样就实现了全局保持登录状态
                this.login(userInfo)
            }
        },
        methods: {  
            ...mapMutations(['login'])  
        }  
    }  
</script>

📄H5和小程序获取页面url

1. 问题说明

项目中,跳转页面过程中,有时会带有一些参数,比如:http.../pages/index/index?id=XXX&name=XXX

要拿到链接后的参数有多种方法,在h5页面中可以用 location.href 直接获取页面路径,然后再进行处理。而在小程序中就要用 getCurrentPages() 获取页面栈后再进行操作。

2. h5获取url中"?"符后的参数

getRequest() {
    let url = location.href;
    let requestParams = {};

    if (url.indexOf("?") !== -1) {
        let str = url.substr(url.indexOf("?") + 1); //截取?后面的内容作为字符串
        let strs = str.split("&"); //将字符串内容以&分隔为一个数组
        for (let i = 0; i < strs.length; i++) {
            requestParams[strs[i].split("=")[0]] = decodeURI(strs[i].split("=")[1]);
         // 将数组元素中'='左边的内容作为对象的属性名,'='右边的内容作为对象对应属性的属性值
        }
    }
    return requestParams;
}

3. 微信小程序获取页面url

小程序不能直接用 location.href 获取参数,需要使用 getCurrentPages() 获取页面栈后再进行操作

// mounted中调用
getRequest() { 
    let pages = getCurrentPages();	//获取加载的页面
    let currentPage = pages[pages.length - 1];	//获取当前页面的对象
    
    let url = currentPage.route //当前页面url
    let options = currentPage.options;	// 获取url中所带的参数
    console.log("获取url中所带的参数",options)
	
    //比如:获取参数后面的id和name
    this.lmid = options.id
    this.lmname = options.name
}

可以写成工具函数放到utils中:

/*获取当前页url*/
function getCurrentPageUrl(){
    var pages = getCurrentPages() //获取加载的页面
    var currentPage = pages[pages.length-1] //获取当前页面的对象
    var url = currentPage.route //当前页面url
    return url
}

/*获取当前页带参数的url*/
function getCurrentPageUrlWithArgs(){
    var pages = getCurrentPages() //获取加载的页面
    var currentPage = pages[pages.length-1] //获取当前页面的对象
    var url = currentPage.route //当前页面url
    var options = currentPage.options //如果要获取url中所带的参数可以查看options

    //拼接url的参数
    var urlWithArgs = url + '?'
    for(var key in options){
        var value = options[key]
        urlWithArgs += key + '=' + value + '&'
    }
    urlWithArgs = urlWithArgs.substring(0, urlWithArgs.length-1)

    return urlWithArgs
}

module.exports = {
    getCurrentPageUrl: getCurrentPageUrl,
    getCurrentPageUrlWithArgs: getCurrentPageUrlWithArgs
}

4. 参考文章

📄uniapp跳转外部链接

uni.navigateTo 可以跳转到项目的内部页面,然后内部页面接收需要跳转到外部的URL,通过 webview 来打开外部链接。

1. 新建一个内部页面webview.vue

<template>
	<view>
		<web-view :src="url"></web-view>
	</view>
</template>

<script>
export default {
  data() {
    return {
      url: ''
    }
  },
  onLoad(options) {
    this.url = decodeURIComponent(options.url)
    console.log(this.url)
    // 传入需要跳转的链接 使用web-view标签进行跳转
  }
}
</script>

<style lang="scss"> </style>

pages.json 里面注册这个页面

{
    "path" : "pages/common/webview",
    "style" :                                                                             
    {
    "navigationBarTitleText": "",
    "enablePullDownRefresh": false
    }
}

2. 点击跳转外部链接

界面:

<view @click="skipLink()"> 跳转外部链接 </view>

跳转方法:

skipLink() {
    // URL是要跳转的外部地址 作为参数
	let url = 'http...'
    
	uni.navigateTo({
        // 传url到webview界面,实现跳转
		url: '/pages/common/webview?url=' + url
	})
}

3. 参考链接

📄uniapp中页面刷新后返回失败

goBack(){
    // 获取页面栈
    const pages = getCurrentPages()
    if (pages && pages.length > 1) {
        uni.navigateBack({
            delta: 1	// 数量根据缓存的页面数量
        })
    } else {
        history.go(-1) 
    }
}

📄小程序页面内上传图片功能

1. 需求说明

微信小程序中上传图片,要求最多上传6张图片,上传到6张后隐藏上传按钮。

参考代码,可直接使用:

<view class="upload-image-box">
    <view class="upload-image-item" v-for="(item, index) in totalImg" :key="index">
        <view class="close-icon" @tap="deleteImg(index)">
            <uni-icons type="closeempty" size="18" color="#fff"></uni-icons>
        </view>
        <view class="image-box"><image :src="item.url" mode="aspectFill" class="img"></image></view>
    </view>
    <view class="upload-image-item" v-if="totalImg.length < 6" @tap="chooseImgs">
        <view class="uploadBtn">
            <uni-icons type="plusempty" size="40" color="rgba(0, 0, 0, 0.65)"></uni-icons>
            <view>上传照片</view>
        </view>
    </view>
</view>
<view class="uploadMess">
    <view>上传图片说明</view>
    <view>要求:格式PNG/JPG,6M以内,最多6张</view>
    <view>内容:图纸等</view>
</view>
<script>
export default {
  data(){
    maxSize: 1024*1024*6, //图片大小限制6M
    maxLength: 6,
    totalImg: [], //原图
    urlImgs: [], // 已上传的图
  },
  methods:{
    //上传图片 单个上传 方便检测每张图片的大小
    chooseImgs() {
        const nowCount = this.maxLength - this.totalImg.length;
  	    const _this = this;
        uni.chooseImage({
            count: 6,
            success: res => {
                uni.showLoading({
                    title: '上传中...'
                });
                const tempFilePaths = res.tempFilePaths;
                const tempFiles = res.tempFiles;
                tempFiles.forEach((ele, index) => {
                    if (ele.size > _this.maxSize) {
                        return uni.showToast({
                            icon: 'none',
                            title: '图片大小不能超过6MB'
                        });
                    }
                });

                // 上传图片到服务器
                for (let i = 0; i < tempFilePaths.length; i++) {
                    uni.uploadFile({
                        url: uploadFile, //uploadFile为上传到服务器的接口地址
                        filePath: tempFilePaths[i],
                        name: 'file',
                        success: uploadFileRes => {
                            let url = JSON.parse(uploadFileRes.data).data;
                            this.urlImgs.push(url);
                            this.totalImg.push({
                            url: tempFilePaths[i]
                            });
                            uni.hideLoading();
                         },
                        fail: () => {
                          return uni.showToast({
                            icon: 'none',
                            title: '图片上传失败'
                          });
                        }
                    });
                }
            }
          });
      },
      // 删除图片 本地和线上都删除
      deleteImg(index) {
        this.totalImg.splice(index, 1);
        this.urlImgs.splice(index, 1);
      },
  }
}
</script>

<style lang="scss" scoped>
    .upload-image-box {
        display: flex;
        flex-wrap: wrap;
        padding: 10px 0;
        .close-icon {
            display: flex;
            justify-content: center;
            align-items: center;
            position: absolute;
            right: 0;
            top: 0;
            width: 16px;
            height: 16px;
            border-radius: 50%;
            background-color: #ff5a5f;
            z-index: 2;
        }
        .upload-image-item {
            width: 33.33%;
            position: relative;
            padding-top: 33.33%;
            box-sizing: border-box;
            .image-box {
                display: flex;
                justify-content: center;
                align-items: center;
                position: absolute;
                top: 5px;
                right: 0px;
                bottom: 5px;
                left: 0px;
                border: 1px solid rgba(0, 0, 0, 0.15);
                padding: 8px 7px 7px 8px;
                border-radius: 2px;
                overflow: hidden;
                image {
                    width: 100%;
                    height: 100%;
                }
            }
            .uploadBtn {
                background-color: rgba(0, 0, 0, 0.04);
                position: absolute;
                top: 5px;
                right: 0px;
                bottom: 5px;
                left: 0px;
                padding: 8px 7px 7px 8px;
                border: 1px solid rgba(0, 0, 0, 0.15);
                border-radius: 2px;
                overflow: hidden;
                text-align: center;
                image {
                    width: 100%;
                    height: 100%;
                }
            }
        }
    }
    .uploadMess {
        text-align: left;
        background-color: #F8F8F8;
        padding-top: 10px;
        padding-left: 12px;
        padding-bottom: 12px;
        border-radius: 4px;
        color: #B3B3BB;
        font-size: 12px;
    }
</style>

2. 参考文章

📄小程序使用腾讯导航路线规划功能

小程序后台添加腾讯位置服务路线规划插件

小程序后台 > 设置 > 第三方设置 > 插件管理 > 添加《腾讯位置服务路线规划》插件

插件详情中查看AppId和版本号

AppId和版本号,参考 腾讯位置服务路线规划开发文档

项目的pages.json中引入插件并开启位置服务

注意:manifest.json 源码文件的 mp-weixin 对象中也需要添加

"plugins": {
	"routePlan": {
		"version": "1.0.19",
		"provider": "wx50b5593e81dd937a"
	}
},
"permission": {
	"scope.userLocation": {
		"desc": "你的位置信息将用于小程序位置接口的效果展示"
	}
}

实现Demo

<template>
  <view>
     <button class="btn-long" @click="doNavi()">导航</button>
  </view>
</template>
 
<script>
export default {
	methods: {
		doNavi() {
			let plugin = requirePlugin('routePlan');
			let key = 'QTOBZ-VSO35-MKWIS-I2I4G-ATD5S-NZBID'; //使用在腾讯位置服务申请的key
			let referer = '小程序'; //调用插件的app的名称
			let endPoint = JSON.stringify({ //终点
				'name': '山西质监检测中心六号楼食品院',
				'latitude': 37.69331695869906,
				'longitude': 112.7597089963646
			});
			uni.navigateTo({
				url: 'plugin://routePlan/index?key=' + key + '&referer=' + referer + '&endPoint=' + endPoint
			});
		}
    },
}
</script>

参考文章

路线规划插件开发指南

uniapp-微信小程序腾讯地图导航

uniapp 微信小程序内打开腾讯导航路线规划

📄处理付款二维码

一般情况下,图像数据(尤其是GIF格式)不会以纯文本形式返回,而是以二进制流或Base64编码的字符串返回。比如付款二维码可能会是GIF格式,我们在处理时就要确保返回的是二进制数据

1. 设置响应类型:responseType: 'arraybuffer' //设置响应类型为arraybuffer (二进制数据)

2. 处理响应数据: 将二进制数据转换为Base64字符串

getPriceQR() {
	let param = { memberLimit: '20' }
	uni.request({
		url: baseUrl + '/media/memberShip/purchasebywx?userId=' + this.userID,
		data: JSON.stringify(param),
		method: "POST",
		responseType: 'arraybuffer', //设置响应类型为arraybuffer (二进制数据)
		header: {'Content-Type': 'application/json'}
	}).then((result) => {
		let [err, res] = result;
		// console.log("res",res);
		// 将图像数据处理成 base64 格式
		let selectedQR = 'data:image/png;base64,' + btoa(new Uint8Array(res.data)
			.reduce((data, byte) => data + String.fromCharCode(byte), ''))
	})
}

🌈常用 JS 方法

📄数组去重

1. 通用方式

let dataArr = res.data.obj.records;
var newDataArr = [];
for (var i = 0; i < dataArr.length; i++) {
	var flag = true;
	if(newDataArr.length > 0){
		for(let n = 0; n < newDataArr.length; n++) {
			if(newDataArr[n].docid == dataArr[i].docid){flag = false;};
		}
	};
	if(flag){
	 newDataArr.push(dataArr[i]);
	};
}
console.log("数组去重后>>>", newDataArr);

2. Jquery方式

var dataArr = data_s.obj.records
var newDataArr = []
// 数组去重
$.each(dataArr,function(i,v){
   var flag = true;
   if(newDataArr.length > 0){
	   $.each(newDataArr,function(n,m){
		   if(newDataArr[n].perId == dataArr[i].perId){flag = false;};
	   });
   };
   if(flag){
	   newDataArr.push(dataArr[i]);
   };
});
console.log("搜索结果-筛选后",newDataArr);

📄常用for循环

// for in循环出的是key >> 一般常用来遍历对象或json		
for (let i in arr) {
    console.log(item); // 0 1 2 3
}

// for of循环出的是val >> 数组对象都可以遍历
for (let item of arr) {
    console.log(item); //{userid:"", status:"", ...}
}

// forEach 遍历数组中的每个元素,直接对原数组进行操作,不会返回一个新数组,
arr.forEach((item,index) => {
    console.log(item,index); //{}1, {}2,...
})

// map 遍历数组中的每个元素,并返回一个新的数组
let arr = [10, 20, 40, 50]
let newArr = arr.map(value => {
    return value*2  //20, 40, 80, 100
})

📄JS 删除数组中某个元素

1. 删除数组中某个指定下标的元素

注意:不能用 forEach 方法比对数组下标值,因为 forEach 在循环的时候是无序的

splice 删除

var delete_index = 2
var arr = [1,2,3,4,5]
// arr => [1,2,3,4,5]
var new_arr = arr.splice(delete_index, 1)
// new_arr => [3]
// arr => [1,2,4,5]

for 删除

var delete_index = 2,
    arr = [1,2,3,4,5],
    new_arr = []

for (let i = 0, len = arr.length; i < len; i++) {
    if (i != delete_index) {
        new_arr.push(arr[i])
    }
}

// arr => [1,2,3,4,5]
// new_arr => [1,2,4,5]

2. 删除数组中某个指定元素的元素

splice 删除

var element = 2,
    arr = [1,2,3,4,5]

arr.splice(arr.indexOf(2), 1)
// arr => [1,3,4,5]

filter 删除

filter:将数组中符合条件的元素保存到一个新的数组中(过滤数组中的元素)

// 对象数组
let arr = [
	{name:"张三",age:18},
	{name:"李四",age:19},
	{name:"王五",age:20}
]
let list = arr.filter((item) => item.name !== '张三')
console.log(list);
// list => 李四、王五

// 数组
let arr = [4,5,7,9]
let list = arr.filter((item) => item !== 9)
console.log(list);
// list => [4, 5, 7]

📄段落展开/收起

//html
<view class="express">
    <view class="info">
        <view :class="{hide:!iSinfo}">
            {{newInfo}}
        </view>
        <text @tap="showinfo" v-if="!iSinfo">展开</text>
    </view>
    <text @tap="showinfo" v-if="iSinfo" class="hidebtn">收起</text>
</view>
//data数据
iSinfo: false,

// methods
//全文展开收起
showinfo() {
    this.iSinfo = !this.iSinfo
},
    
// 获取dom元素 请求到数据后再调用
getData() {
	if (this.newInfo == '' || this.newInfo.length == 0) {
		this.iSinfo = true
	} else {
		let info_length = this.newInfo.length //字符长度
		if (info_length > 68) {
			this.iSinfo = false //false隐藏  
		} else {
			this.iSinfo = true //true不隐藏  
		}
	}
},
// css
.hide {
    word-break: break-word; //换行模式
    overflow: hidden;
    text-overflow: ellipsis; //修剪文字
    display: -webkit-box;
    -webkit-line-clamp: 3; //此处为上限行数
    -webkit-box-orient: vertical;
}

📄下拉刷新和上拉加载

mescroll.js 高性能下拉刷新和上拉加载插件,支持 uni-app

<template>
	<view class="page">
		<!-- 分页更多用法请查看官网 http://www.mescroll.com-->
		<mescroll-body @init="mescrollInit" :down="downOption" @down="downCallback" @up="upCallback">
			<view v-for="data in dataList"> 数据列表... </view>
		</mescroll-body>
	</view>
</template>

<script>
	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
	export default {
		mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件)
		data() {
			return {
				downOption: {
					auto: false //是否在初始化后,自动执行downCallback; 默认true
				},
				dataList: [], //商品数据
			}
		},
		methods: {
			/*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */
			upCallback(page) {
				//联网加载数据
				this.loadData(page.num)
			},
			// 特价商品
			loadData(pageNo) {
				let httpData = {
					entity: {
						userid: this.userInfo.id,
						throughType: this.activeName,
					},
					pager: {
						current: pageNo,
						size: 10,
						sortProps: [{
							"key": "crtime",
							"value": false
						}]
					}
				}
				uni.$u.http.post(baseUrl + '/SX/jmetasxzgsfqthroughlist/listing', httpData).then(res => {
					uni.stopPullDownRefresh();
					//方法一(推荐): 后台接口有返回列表的总页数 totalPage
					this.mescroll.endByPage(res.length, res.pages); //必传参数(当前页的数据个数, 总页数)
					if (pageNo == 1) {
						this.dataList = res
					} else {
						this.dataList = this.dataList.concat(res);
					}
				}).catch(() => {
					//联网失败, 结束加载
					this.mescroll.endErr();
				});
			},
		},
	}
</script>

<style scoped lang="scss">
	.page {
		padding-top: 2rpx;
	}

	.goodsBox {
		padding: 50rpx 32rpx;
		border-bottom: 2rpx solid #f5f5f5;
		background: #fff;

		.goodsImg {
			width: 80rpx;
			height: 80rpx;
			border-radius: 40rpx;
		}

		.info {
			height: 80rpx;
			flex-direction: column;
			justify-content: space-between;
			align-items: flex-start;
			padding-left: 20rpx;

			.title {
				font-size: 30rpx;
				color: #333;
			}

			.desc {
				width: 100%;
				font-size: 26rpx;
				color: #666;
			}
		}
	}
</style>

📄获取 URL 中 "?" 符号后的参数

function getUrlParams(url) {
    // 使用正则表达式匹配 URL 中的参数
    // [?&] 匹配问号或和号,是参数的开始
    // ([^=#]+) 匹配不是=或#的字符一次或多次,代表参数名
    // = 匹配等号,参数名和值之间的连接
    // ([^&#]*) 匹配不是&或#的字符零次或多次,代表参数值
    let reg = /[?&]([^=#]+)=([^&#]*)/g,
        params = {},
        match;
    
    // 使用正则表达式的 exec 方法在字符串中查找匹配项
    while (match = reg.exec(url)) {
        // 将匹配到的参数名和值存储到 params 对象中
        params[match[1]] = match[2];
    }
    return params;
}

// 获取当前页面的完整 URL。
// 例: http://example.com/index.html?name=John&age=30
let currentUrl = window.location.href;
let parameters = getUrlParams(currentUrl);

//输出{name: "John",age: "30"}
console.log(parameters);

🌈常用功能

📄页面中嵌入PDF或Word文档

$(document).ready(function() {
  // 定义文档路径
  let pdfpath = 'https://www.zhtnqi.com/files/headimg/75ed241d-e933-4fce-b93a-ae5440d8a4bf.pdf';
    
  if (pdfpath) {
      // 初始化要插入的内容
      let content = '';
      
      // 判断文件类型 1.Word文档(.doc或.docx) 2.PDF文件
      if (pdfpath.endsWith('.doc') || pdfpath.endsWith('.docx')) {
          let wordUrl = 'https://view.officeapps.live.com/op/embed.aspx?src=' + pdfpath;
          content = `<iframe class="filename" src="${wordUrl}" width="100%" height="600" frameborder="1"></iframe>`;
      } else if (pdfpath.endsWith('.pdf')) {
          content = `<embed src="${pdfpath}" type="application/pdf" width="100%" height="700px" />`;
      }

      $('.content').html(content);
  }
});

📄跨源通信:在不同服务器间安全传递Token

1. 问题描述

服务器A 上有一个页面,该页面通过 iframe 方式嵌入到 服务器B 的页面中。我想在 服务器A 的页面中存储一个 token,并且在 服务器B 的页面中获取这个 token。

2. 难点

这个问题涉及到跨域资源共享(CORS)和浏览器的同源策略。由于 服务器A 和 服务器B 是不同的域,所以它们不能直接共享数据,比如通过 localStorage 把 token 存到本地就不可取。

3. 解决方法

window.postMessage 方法允许不同源之间的窗口进行通信,服务器A 的页面是通过iFrame嵌入到另一个服务器页面的,正好适用。所以可以在iFrame页面(服务器A)上发送消息,在父页面(服务器B)上设置事件监听器来接收这些消息。

发送消息的页面(服务器A)

在 服务器A 的页面中,使用以下代码向 服务器B 发送消息:

function sendMessageToParent(token) {
    var parentWindow = window.parent; // 获取目标页面的window对象
    var message = { type: 'token', data: token };

    // 使用'*'作为目标源可以接收来自任何源的消息, 也可以指定目标源。
    parentWindow.postMessage(message, '*');
}

// 发送 token 到 服务器B
var tokenValue = 'token';
sendMessageToParent(tokenValue);

接收消息的页面(服务器B)

在 服务器B 的页面中,使用以下代码接收来自 服务器A 的消息:

function receiveMessage(event) {
    // 通过event.origin检查消息发送者的源
    // if (event.origin !== 'http://服务器A') { return; }
    
    // 检查消息类型
    if (event.data.type && event.data.type === 'token') {      
        var token = event.data.data;
		console.log('接收token: ', token);
		
		//token存到本地
		localStorage.setItem("token",token)
    }
}

// 添加事件监听器来接收消息
window.addEventListener('message', receiveMessage, false);

🌈vue项目

📄vue项目运行问题

// 项目运行基本步骤
1、下载依赖文件:npm intsall
2、修改项目配置,如后台地址:src\conf\conf.js
3、启动项目:npm run dev
4、打包命令:npm run build //打包后的代码在 dist文件夹

//如果运行失败 尝试以下命令然后重新运行
npm cache clean --force
删掉node_modules文件夹
删掉package-lock.json文件