windows 2008 VPN(PPTP/L2TP)搭建
PPTP和L2TP只差一步配置,现在苹果已经不支持PPTP,所以只能使用L2TP连接。废话不多说,下面开始搭建: 1、PPTP VPN 配置 新安装好的OS,进入系统,首先添加角色 勾选添加网络策略和访问服务 如图勾选需要的角色服务 安装完成后,依次点击开始-管理工具-路由与远程访问工具 如图在服务器上右键,选择“配置并启动路由和远程访问服务” 因为是单网卡机器,所以选择自定义配置 选择VPN访问和NAT。 向导安装完成之后,配置添加VPN连接客户机所用的地址池。 此处也可以配置dhcp动态池,此处省略了,测试过也是可以的。 然后按照下图开启NAT访问,否则VPN无法上网 右键,新增接口 至此,RRAS的配置已经完成了,接下来进入NPS配置。 客户端的设置 此处填写VPN服务器的外网ip 至此,win08 pptp VPN的搭建配置已经成功,此时客户机可以通过vpn连接到腾讯云的服务器,并且可以通过VPN服务器连接上internet。 2:L2TP 服务器搭建 按照下图操作,打开路由与远程访问,找到服务器右键属性——安全——允许L2TP连接使用自定义IPSEC策略,然后配置密钥,确定之后重启一下服务即可,在客户端连接的时候输入将配置的密钥输入进去就可以正常连接啦 2020/02/23 如果配完不能用,请把【路由与远程访问】部署禁用再配一下遍。 from:https://www.wyxxw.cn/blog-detail-22-24-494
View DetailsWindows Server 2008 R2 单网卡搭建VPN最详细图解
如何用Windows Server 2008 R2 单网卡搭建VPN? 今天上午做了个详细图解教程,希望对大家有所帮助! 开始! 找一台安装Windows Server 2008 r2的服务器 第一步:安装角色 添加角色 把网络策略和访问服务打上勾号 在角色服务里按图打上勾号,点下一步 点击安装,等待安装完成 点击关闭,完成安装 第二步:配置路由和远程访问 在开始菜单中-->管理工具中找到“路由和远程访问” 如图:右键选择“配置并启用路由和远程访问” 选择自定义配置 全部打上勾号,并下一步 点“完成” 点“确定”,并等待完成配置 完成好配置如下 右键NAT,选择新增接口 选择“本地连接” 选择公用接口到专用网络 按图示操作 按图中步骤,添加的IP地址数,按您的实际要求填写 第三步:配置网络策略服务 按图中找到“网络策略服务器” 网络策略中的红叉的行,右键选择属性,再选择授予访问权限,并点击确定。 第四步:添加VPN账号密码 打开“服务器管理器” 按图示添加VPN的账号密码 第五步:本地安全策略的设置 本步骤是为服务器安全,以网址随便登录桌面和远程桌面。 打开“本地安全策略和组” 按图示步骤一步一步操作,一共是两项,拒绝本地登录和拒绝通过远程桌面服务登录。 完成后如图示 这样整合VPN的安装配置就完成了,快去找一台电脑测试下吧! from:http://www.min68.com/archives/WinddowsServer2008r2danwangkavpndajian.html
View Detailswin2008架设vpn 新建用户指定IP地址的方法
008架设vpn服务器完毕,新建账户,分配了静态IP地址, 但是客户端拨号后获取了另一个IP 怎么才能给客户端指定IP,这里就为大家分享一下 自己解决了,具体如下 1、开启NPS, 2、创建并配置策略 (备注:本人新建账户均归属guests,故选择用户组添加“GUESTS”) 主要就是下面红框框一定要勾上 操作完毕,解决 from:https://www.jb51.net/article/103056.htm
View DetailsERROR 1227 (42000): Access denied; you need (at least one of) the SUPER privilege(s) for this operation
开启super权限: 1. update user set Super_priv=‘Y’ where User=‘root’ 2. flush privileges from:https://www.cnblogs.com/xiaoit/p/4415754.html
View Details服务器管理器没有“本地用户和组”怎么办?
Win2008系统和win7以上版本管理用户都是在,计算机管理、服务器管理器里面点击配置—用户和组来管理用户。但是咗嚛突然发现服务器的2008系统没有了本地用户和组怎么办呢 组策略限制用户和组功能 出现这种情况一般是组策略做限制了,打开运行gpedit.msc打开组策略编辑器 依次点击,用户设置—管理模板—mircosoft管理控制台—受限制的许可管理单元— 右侧 【本地用和组】 把本地用户和组的设置,禁用状态设置为 启用,或者 未配置,然后确定 此外,如果你不记得在什么选项下面,可以直接点击。用户配置—所有设置,按照状态排序来查找 刷新策略 设置好之后,点击开始运行—gpupdate/force 刷新策略,让刚刚修改的生效 设置好之后,再次打开服务器管理器,计算机管理。查看已经有 本地用户和组了 其他可能原因 如果检查策略里面没有设置,说明您的操作系统版本的问题(家庭版或者普通版可能没有)。 开始菜单--输入 control userpasswords2 来调用账号管理菜单 同样的方法针对windows下其他xp以上版本都有效,如图。即可使用用户账号功能了 from:https://jingyan.baidu.com/article/54b6b9c0e04e172d583b4781.html
View Details'cross-env' 不是内部或外部命令,也不是可运行的程序
运行: cnpm i cross-env --save-dev from:https://www.cnblogs.com/linsx/p/9353429.html
View DetailsJS-iframe高度自适应内容
iframe:https://developer.mozilla.org/zh-CN/docs/Web/HTML/Element/iframe iframe 内容加载后不改变 使用:onload="this.height=this.contentWindow.document.documentElement.scrollHeight" 例如:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>自适应高度</h1> <iframe srcdoc='<div style="height: 400px;width: 400px;background: #ddd;"></div>' frameborder="1" scrolling="no" width="100%" onload="this.height=this.contentWindow.document.documentElement.scrollHeight"></iframe> <h1>非自适应高度</h1> <iframe srcdoc='<div style="height: 400px;width: 400px;background: #ddd;"></div>' frameborder="1" scrolling="no" width="100%"></iframe> </body> </html> |
iframe 内容加载后改变 定时改变 iframe 高度:
|
1 2 3 |
setInterval(()=>{ document.querySelector('iframe').height = window.frames[0].document.documentElement.scrollHeight; }, 200); |
例如:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <h1>自适应高度</h1> <iframe srcdoc='<button onclick="this.parentNode.appendChild(this.cloneNode())" style="width: 100px; height: 100px;display: block;"></button>' frameborder="1" scrolling="no" width="100%" onload="this.height=this.contentWindow.document.documentElement.scrollHeight"></iframe> <h1>非自适应高度</h1> <iframe srcdoc='<button onclick="this.parentNode.appendChild(this.cloneNode())" style="width: 100px; height: 100px;display: block;"></button>' frameborder="1" scrolling="no" width="100%"></iframe> <script> setInterval(()=>{ document.querySelector('iframe').height = window.frames[0].document.documentElement.scrollHeight; }, 200); </script> </body> </html> |
from:https://www.cnblogs.com/jffun-blog/p/9774121.html
View Details理解Vuex的辅助函数mapState, mapActions, mapMutations用法
在讲解这些属性之前,假如我们项目的目录的结构如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
### 目录结构如下: demo1 # 工程名 | |--- dist # 打包后生成的目录文件 | |--- node_modules # 所有的依赖包 | |--- app | | |---index | | | |-- views # 存放所有vue页面文件 | | | | |-- parent.vue # 父组件 | | | | |-- child.vue # 子组件 | | | | |-- index.vue | | | |-- components # 存放vue公用的组件 | | | |-- js # 存放js文件的 | | | |-- store # store仓库 | | | | |--- actions.js | | | | |--- mutations.js | | | | |--- state.js | | | | |--- mutations-types.js | | | | |--- index.js | | | |-- app.js # vue入口配置文件 | | | |-- router.js # 路由配置文件 | |--- views | | |-- index.html # html文件 | |--- webpack.config.js # webpack配置文件 | |--- .gitignore | |--- README.md | |--- package.json | |--- .babelrc # babel转码文件 |
具体理解vuex的项目构建可以看这篇文章(https://www.cnblogs.com/tugenhua0707/p/9763177.html). 下面讲解的也是在这篇文章项目结构基础之上进行讲解的。当然如果你对 vuex熟悉的话,就不用看了,直接跳过即可。 注意:下面的代码都是在 webpack+vue+route+vuex 中构建的,可以把下面的代码 复制到该项目中运行即可。 一:理解mapState的使用 当我们的组件需要获取多个状态的时候,将这些状态都声明为计算属性会有些重复和冗余,为了解决这个问题,我们可以使用mapState的辅助函数来帮助我们生成计算属性。 mapState函数返回的是一个对象,我们需要使用一个工具函数将多个对象合并为一个,这样就可以使我们将最终对象传给computed属性。 上面的表述可能会有些模糊,下面我们来做个简单的demo来演示一下: 项目架构如上面示意图所示,先看看 app/index/store/state.js 代码如下:
|
1 2 3 4 5 |
export default { add: 0, errors: '', counts: 0 }; |
app/index/store/mutations.js 代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import * as types from './mutations-types'; export default { [types.ADD] (state, payload) { state.add = payload; }, [types.SETERROR] (state, payload) { state.errors = payload; }, [types.COUNTASYNC] (state, payload) { state.counts = payload; } } |
app/index/store/mutations-types.js 代码如下:
|
1 2 3 4 5 6 7 8 |
// 新增list export const ADD = 'ADD'; // 设置错误提示 export const SETERROR = 'SETERROR'; // 异步操作count export const COUNTASYNC = 'COUNTASYNC'; |
app/index/store/index.js 代码如下:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
import Vue from 'vue'; import Vuex from 'vuex'; import state from './state'; import mutations from './mutations'; import actions from './actions'; Vue.use(Vuex); Vue.config.devtools = true; export default new Vuex.Store({ state, mutations, actions }); |
app/index/store/actions.js 代码请看github 如上代码所示,现在我们在 app/index/views/parent.vue 这个路由下,在mounted生命周期打印一下 console.log(this);这句代码的时候,如下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<template> <div></div> </template> <script type="text/javascript"> export default { data() { return { } }, methods: { }, mounted() { console.log(this); } } </script> |
在浏览器运行后,如下图所示: 如果我们想获取add,或 count的时候,我们需要使用 this.store.state.add或this.store.state.add或this.store.state.count 这样的。 现在我们使用 mapState的话,代码就变成如下了:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
<template> <div> </div> </template> <script type="text/javascript"> import { mapState } from 'vuex'; export default { data() { return { } }, methods: { }, computed: { ...mapState({ add: state => state.add, counts: state => state.counts }) }, mounted() { console.log(this.add); // 打印出 0 console.log(this.counts); // 打印 0 } } </script> |
如上代码,我们使用 mapState工具函数会将store中的state映射到局部计算属性中。 我们在mounted方法内,直接使用 this.xx 即可使用到对应computed中对应的属性了。也就是 我们使用 this.add 就直接映射到 this.$store.state.add 了 。 当然mapState也可以接受一个数组,如下简单代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
computed: { /* ...mapState({ add: state => state.add, counts: state => state.counts }) */ ...mapState([ 'add', 'counts' ]) }, mounted() { console.log(this); } |
然后我们再在控制台查看输出的this的值,如下: 可以看到,接受数组也是可以的,在mounted生命周期内,我们直接可以使用 this.add 或 this.counts 可以获取到值了。 切记:mapState的属性的时候,一定要和state的属性值相对应,也就是说 state中定义的属性值叫add,那么mapState就叫add,如果我们改成add2的话,就获取不到add的值了,并且add2的值也是 undefined,如下所示: 二:理解mapActions的使用 mapActions 的思想 和 mapState 一样的,下面我们直接看代码的使用方法哦,如下代码: 如果我们不使用 mapActions 的话,我们调用某个方法需要如下代码所示:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
<template> <div></div> </template> <script type="text/javascript"> export default { data() { return { } }, created() { this.test(); }, methods: { test() { // 调用action 需要时使用 this.$store.dispatch 这样的 Promise.all([this.$store.dispatch('commonActionGet', ['getPower', {}])]).then((res) =>{ }); } }, computed: { }, mounted() { } } </script> |
下面我们使用 mapActions的话,代码如下所示:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
<template> <div> </div> </template> <script type="text/javascript"> import { mapActions } from 'vuex'; export default { data() { return { } }, created() { this.test(); }, methods: { test() { // 调用 Promise.all([this.commonActionGet(['getPower', {}])]).then((res) => { }); }, // mapActions 使用方法一 将 this.commonActionGet() 映射为 this.$store.dispatch('commonActionGet') ...mapActions(['commonActionGet', 'commonActionGetJSON', 'commonActionPost', 'commonActionPostJSON']) /* // 第二种方式 ...mapActions({ 'commonActionGet': 'commonActionGet', 'commonActionGetJSON': 'commonActionGetJSON', 'commonActionPost': 'commonActionPost', 'commonActionPostJSON': 'commonActionPostJSON' }) */ } } </script> |
三:理解 mapMutations 的使用。 首先我们不使用 mapMutations的话,调用mutations里面的方法,是如下代码:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<template> <div> </div> </template> <script type="text/javascript"> export default { data() { return { } }, created() { this.test(); }, methods: { test() { // 调用Mutations 需要时使用 this.$store.commit('ADD', 1) 这样的 Promise.all([this.$store.commit('ADD', 1)]).then(() =>{ console.log(this); }); } } } </script> |
打印 如上 this代码后,看到如下图所示: 想获取值,使用 this.$store.state.add 就等于1了。 下面我们使用 mapMutations话,代码需要改成如下代码: […]
View Details【Vuex】mapGetters 辅助函数
mapGetters 辅助函数仅仅是将 store 中的 getter 映射到局部计算属性:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import { mapGetters } from 'vuex' export default { // ... computed: { // 使用对象展开运算符将 getter 混入 computed 对象中 ...mapGetters([ 'doneTodosCount', 'anotherGetter', // ... ]) } } |
如果你想将一个 getter 属性另取一个名字,使用对象形式:
|
1 2 3 4 |
mapGetters({ // 映射 `this.doneCount` 为 `store.getters.doneTodosCount` doneCount: 'doneTodosCount' }) |
扩展:ES6展开运算符 定义: .展开运算符允许一个表达式在某处展开。 使用场景 1.展开函数在多个参数的地方使用 。意指用于函数传参 2.多个元素的地方使用,意指用于数组字面量 3.多个边框的地方使用,意指用于解构赋值 注意事项 展开运算符不能用在对象当中,因为目前展开运算符只能在可遍历对象(iterables)可用。 iterables的实现是依靠[Symbol.iterator]函数,而目前只有Array,Set,String内置[Symbol.iterator]方法,而Object尚未内置该方法,因此无法使用展开运算符。不过ES7草案当中已经加入了对象展开运算符特性。 函数调用中使用展开运算符 之前实现方式
|
1 2 3 4 5 |
function test(a, b, c) { return a + b +c; } var args = [0, 1, 2]; test.apply(null, args);//3 |
如上,我们把args数组当作实参传递给了a,b,c,这边正是利用了Function.prototype.apply的特性。 ES6实现方式
|
1 2 3 4 5 |
function test(a, b, c) { return a + b + c; } var args = [0, 1, 2]; test(...args);//3 |
使用…展开运算符就可以把args直接传递给test()函数。 数组字面量中使用展开运算符 例如:两个数组合并为一个数组
|
1 2 |
var arr1=['a','b','c']; var arr2=[...arr1,'d','e']; //['a','b','c','d','e'] |
用在push函数中,可以不用apply()函数合并2个数组
|
1 2 3 |
var arr1=['a','b','c']; var arr2=['d','e']; arr1.push(...arr2); //['a','b','c','d','e'] |
用于解构赋值 解构赋值也是ES6中的一个特性,而这个展开运算符可以用于部分情景: 展开运算符在解构赋值中的作用跟之前的作用看上去是相反的,将多个数组项组合成了一个新数组。
|
1 2 3 4 |
let [arg1,arg2,...arg3] = [1, 2, 3, 4]; arg1 //1 arg2 //2 arg3 //['3','4'] |
ps: let [arg1,…arg2,arg3] = [1, 2, 3, 4]; //报错 即:解构赋值中展开运算符只能用在最后: 类数组对象变成数组 展开运算符可以将一个类数组对象变成一个真正的数组对象:
|
1 |
var obj = document.getElementById("box").getElementsByTagName("li"); |
|
1 |
<strong>Array.isArray(obj</strong><strong>);//false</strong> |
|
1 2 3 |
var arr=[...obj]; <strong>Array.isArray(</strong>arr<strong>); //true</strong> |
相关资料:https://vuex.vuejs.org/zh-cn/getters.html https://www.cnblogs.com/mingjiezhang/p/5903026.html http://es6.ruanyifeng.com/#docs/destructuring 作者:smile.轉角 QQ:493177502 from:https://www.cnblogs.com/websmile/p/8328138.html
View Detailsvue中created、mounted等方法整理
created:html加载完成之前,执行。执行顺序:父组件-子组件 mounted:html加载完成后执行。执行顺序:子组件-父组件 methods:事件方法执行 watch:watch是去监听一个值的变化,然后执行相对应的函数。 computed:computed是计算属性,也就是依赖其它的属性计算所得出最后的值
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
export default { name: "draw", data(){ // 定义变量source return { source:new ol.source.Vector({wrapX: false}), } }, props:{ //接收父组件传递过来的参数 map:{ //type:String }, }, mounted(){ //页面初始化方法 if (map==map){ } var vector = new ol.layer.Vector({ source: this.source }); this.map.addLayer(vector); }, watch: { //监听值变化:map值 map:function () { console.log('3333'+this.map); //return this.map console.log('444444'+this.map); var vector = new ol.layer.Vector({ source: this.source }); this.map.addLayer(vector); } }, methods:{ //监听方法 click事件等,执行drawFeatures方法 drawFeatures:function(drawType){} } |
from:https://blog.csdn.net/liudoris/article/details/80255311
View Details