极简实用的Asp.NetCore模块化框架决定免费开源了 - realyrare - 博客园

mikel阅读(735)

来源: 极简实用的Asp.NetCore模块化框架决定免费开源了 – realyrare – 博客园

背景

 在开发这个框架之前,前前后后看过好几款模块化的框架,最后在一段时间内对ABP VNext痛下狠心,研究一段时间后,不得不说 ABP VNext的代码层面很规范,也都是一些最佳实践,开发出一个模块效率也很高。但不得不说,于我而言太重了。还看过一些其他模块化的框架,就不说了,学习成本于我而言太高了,主要是自己懒。

于是,我在想有没有一款上手简单,比较经济实用的模块化框架,只要会.net core 基本就可以上手呢,于是,将ABP VNext的模块化核心代码抽出来(在这里要特别感谢土牛了),结合ASP.NET core很完美,我本身的需求就是做到业务逻辑代码能够复用,不用经常一些已经写过好几遍的简直难受到要吐的重复代码,这于我而言就足够了。

框架简介

一款基于ASP.NET core3.1的模块化开发框架,提取了ABP VNext的模块核心,适合中小型项目快速开发,取名为神牛(ShenNius),意为大神大牛多提意见,一起参与,神牛云集,为dotnet社区贡献一份自己的力量。追求“简单”,“高效”,“实用”,总之秉承大道至简的原则开发,坚持业务模块最低复杂度复用,只要会C#,再会点ASP.NETCore基础知识,极易上手。适合小白入门进阶,更适用(实用)老手上路干活。
所有的业务代码可以按照类库划分,使用宿主托管。所有的代码坚持” Don’t repeat yourself “。坚决反对” 简单的事情复杂干 “,” 大量代码在应用层过度层层封装 “,反对” 过度设计 “的原则下进行开发。如果你有这个习惯,并且也想找一款迷你型、上手快,不用学习太多东西的框架,那么它就适合你,只要你会dotnet core,几乎没有学习成本,除了ABP VNext的模块化核心代码。另外、顺手做了个简单的后台权限管理做为入门例子。采用LayuiMini+Asp.Net Core Razor Page,本来是想用Blazor,我前后看了几款UI框架,目前都不是很成熟,需要踩坑。而我由于时间比较紧迫关系,只有自己一个人,先使用Layui,后期有时间我还是想上Blazor的,目前整个前后端交互基本都是分离的,后面想要切换到Blazor,也很好对接。
注:权限后台管理有部分样式之类的有借鉴“ FytSoaCms”这个开源项目​。​

软件架构

  1. API框架:dotNetCore
  2. ORM:SQLSugarCore
  3. 缓存:MemoryCache(后期会上redis,看项目业务需求)
  4. 日志管理:Nlog
  5. 工具类:Aes加密、Md5加密、RSA加密、Des加密
  6. token:Json Web Token
  7. 实体验证:FluentValidation
  8. 实体映射:AutoMapper

使用说明

  1. ShenNius.ModuleCore是模块化的核心代码
  2. ShenNius.Swagger是封装的API Doc
  3. ShenNius.Share.Infrastructure 基础设施、里面包含常用的扩展方法、静态类
  4. ShenNius.Share.Models 实体层、里面包括Dto验证、配置类
  5. ShenNius.Share.Service 服务层、业务逻辑基本都在这个里面、里面包含了数据访问操作。
  6. ShenNius.Sys.API 基于RBAC的权限API。
  7. ShenNius.Cms.API 基于Cms的API (待完成)
  8. ShenNius.Shop.API 基于Cms的API (待完成)
  9. ShenNius.API.Hosting API的宿主,所有API目前都放在这个里面托管,这也是魅力所在,可以Sys和Cms API各自托管使用独立的宿主,主要看业务量。拆合很容易。
  10. ShenNius.Layui.Admin 基于layui的后台管理。

安装教程

  1. git clone https://gitee.com/shenniu_code_group/shen-nius.-modularity.git
  2. 多项启动ShenNius.API.Hosting 和ShenNius.Layui.Admin
  3. ShenNius.API.Hosting 可以配置你要启动的API项目

效果图

 

最后说明

这个框架,我一直会更新下去,不断的去调整架构,关于Asp.Net Core Api如何配置swagger,FluentValidation等技术文章我近期也会更新文章出来,只要业务需要,我会将一些技术点慢慢地融入到框架中来。尽量做到务实,尽量不在应用层封装自己大量的东西,增加学习成本。我本人真的不喜欢在应用层封装大量东西的框架,包了一层又一层,没任何意义。
另外,近期我会把一些权限管理的前端bug修复下,前端技术我是个半桶水,真的很发愁,如果有人愿意一起做开源,为社区贡献一份力量,那就尽情的联系我吧。以前自己也做了大量的个人项目,但都没有开源出来。这次基本也是从小白做起,一起学习如何做好一个开源项目。

对了,近期我也会把CMS模块尽快完善起来,商城模块后面逐渐排期更新。
最后,如果有什么问题,我也自建了”dotnet根据地”这样一个微信群,可以识别下面的二维码加入,一起交流沟通,如果群二维码过期了也可以识别下面二维码加我微信,邀请你加入微信群​。

 

源码地址

码云:https://gitee.com/shenniu_code_group/shen-nius.-modularity

github:https://github.com/realyrare/ShenNiusFramework

使用宝塔本地安装wordpress测试站点 - WP主题站

mikel阅读(689)

来源: 使用宝塔本地安装wordpress测试站点 – WP主题站

大多数情况下,我们会直接在云服务器上使用WordPress建站,因为非常的方便,也不需要太多的调试。不过有些时候我们会有一些特殊的需求,比如测试插件、主题、二次开发等,这些操作不适合在正式环境中进行,这时候我们就可以在本地安装WordPress,在本文中我们将教大家使用宝塔面板Windows在本地搭建WordPress测试站点

 

安装宝塔Windows客户端

打开宝塔官网,选择Windows版,然后点击立即安装

浏览器会下载宝塔windows的安装包,打开安装包进行安装操作

初始状态下宝塔已经为我们选择好了目录,一般保持默认即可,点击立即安装,过程会持续几分钟

最后点击立即启动,这样我们的客户端就安装完毕了

 

宝塔安装本地环境

前面我们只是安装了宝塔客户端,接下来安装网站需要的基本环境,包括Nginx、PHP、MySQL

找到套件中的宝塔-Web面板,点击启动按钮

启动之后还不能直接使用,点击右上角的折叠菜单,先选择 初始化/修改密码

因为是本地搭建,密码复杂度无所谓,可以随机生成或者写一个好记的密码

 

然后访问地址 http://localhost:888/login.php,输入刚刚修改的账号和密码并登陆面板

后台选择软件管理 – 运行环境,依次安装需要的软件

建议使用Nginx + MySQL + PHP7,因为本地搭建是大部分情况下是测试站点或者开发环境,和真实的服务器安装相同的软件版本,避免出现不兼容的情况

安装过程需要等待一段时间,如果你的电脑性能不错的话会比服务器快很多

 

宝塔新建网站

有了环境之后,我们就可以添加网站了

后台选择新建站点,域名可以随意写,比如添加一个 demo.com,记得选择Mysql数据库和PHP版本

提交以后,测试站点就建好了

但是我们发现还不能访问,因为这个域名并不是我们自己的,接下来需要配置本地hosts文件

在电脑中打开如下的路径 C:\Windows\System32\drivers\etc

会看到一个叫做hosts的文件

右键使用笔记本或者Sublime之类的代码软件打开编辑,添加如下所示代码,如果你使用其他域名,修改为自己的

127.0.0.1 demo.com

注意:如果不能保存的话,使用管理员权限操作

最后访问 demo.com,如果出现恭喜,站点创建成功,那么就没有问题了,如果不出现,需要排查是否有设置错误

然后可以到 D:\wwwroot\demo.com 目录下查看网站文件,把自带的几个html文件删除

 

本地安装WordPress

环境和站点配置好以后,就可以开始安装WordPress了

打开WordPress官方下载页面,下载最新版WordPress安装包,将其解压后,把WordPress目录下的所有文件移动到网站根目录

最后的目录结构如上图

接下来访问域名 demo.com,首先会看到欢迎页面,点击现在就开始

填写数据库信息,数据库信息可以到面板中或者客户端查看

安装WordPress,配置网站基本信息

安装完成后登陆后台 http://demo.com/login.php 管理网站

注意:如果出现卡顿的情况,可能是WordPress在进行更新,可以稍等一会再进入后台

这样我们本地的WordPress就搭建完成了,你可以在上边测试和开发程序,当然需要测试多个的话,还可以随时新开站点,非常的方便。另外,如果你想要直接在服务器中安装Wordpress的话,可以查看我们的WordPress建站教程,教你零基础搭建WordPress

Nginx反向代理使用IIS,使其可以同时在同一端口上访问ASP.NET MVC和Python_lvfk-CSDN博客

mikel阅读(778)

来源: Nginx反向代理使用IIS,使其可以同时在同一端口上访问ASP.NET MVC和Python_lvfk-CSDN博客

准备工作
1、安装Nginx

官网下载 http://nginx.org/en/download.html

2、安装IIS

3、安装python

官网下载 https://www.python.org/

4、配置flup

WSGI是Python应用程序或框架和Web服务器之间的一种接口,已经被广泛接受, 它已基本达成它了可移植性方面的目标。
WSGI 没有官方的实现, 因为WSGI更像一个协议. 只要遵照这些协议,WSGI应用(Application)都可以在任何实现(Server)上运行, 反之亦然。
WSGI具体实现有很多种方法,网上有很多的用python写的框架,比如facebook的tornado,这次选用的是flup
下载以及具体的介绍可以到 http://pypi.python.org/pypi/flup/1.0,
当下载后解压,把文件夹中的flup这个文件夹拷贝到Nginx的安装目录 Python27\Lib\site-packages下面,即可完成flup的配置
ps:1、此处Python和flup需要搭配使用,因为flup有对应py的版本限制

2、Nginx绑定80端口失败,请在Windows的服务中禁用 SQL Server Reporting Services (SQLEXPRESS) 这个服务,因为它就占用了80端口

Nginx配置Python
1、修改nginx-1.10.0\conf中的nginx.conf,在其中增加下面代码

server {
listen 80;
server_name test.com;
#此处的location配置访问服务器上的py
location ^ ~ /python/ {
#fastcgi_pass unix: /tmp/python – cgi.sock;
fastcgi_pass 127.0.0.1 : 8008;#此处的ip及端口会在接下来的py文件中监听使用
#下面三句不用改动
fastcgi_param SCRIPT_FILENAME “”;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi.conf
}
}
2、编写py文件test.py

#!/usr/bin/python
# encoding : utf-8

from cgi import parse_qs
from cgi import escape
from flup.server.fcgi import WSGIServer

def myapp(environ, start_response):
#下面代码是从请求URL中提取URL参数
parameters = parse_qs(environ.get(‘QUERY_STRING’, ”))
if ‘s’ in parameters:
s = escape(parameters[‘s’][0])
if ‘url’ in parameters:
url = escape(parameters[‘url’][0])

#r = test(s, url)

start_response(‘200 OK’, [(‘Content-Type’, ‘text/plain’)])
return “s=”+s+”—“+”url=”+url;

if __name__ == ‘__main__’:
#此处监听的是Nginx中配置的ip和端口
WSGIServer(myapp,bindAddress=(‘127.0.0.1’,8008)).run()
3、运行Nginx

用命令行窗口进入到Nginx文件夹,执行Start Nginx 或者 Nginx

4、运行Py文件test.py

用命令行窗口进入到test.py所在文件夹,执行下面代码

python ytsig.py –method=prefork/threaded minspare=50 maxspare=50maxchildren=1000

5、你就可以在浏览器中访问 http://127.0.0.1/python/?s=12&url=http://127.0.0.1

Nginx反向代理IIS
首先,在IIS中使用ASP.NET MVC4建了一个网站,把其端口设置为:8888(可任意设置一个可用端口)

接下来此处非常简单就可以实现Nginx反向代理IIS,我们接着刚刚Nginx配置Python的基础上执行添加一段代码即可,如下:

server {
listen 80;
server_name test.com;
#此处的location配置访问服务器上的py
location ^ ~ /python/ {
#fastcgi_pass unix: /tmp/python – cgi.sock;
fastcgi_pass 127.0.0.1 : 8008;#此处的ip及端口会在接下来的py文件中监听使用
#下面三句不用改动
fastcgi_param SCRIPT_FILENAME “”;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi.conf
}

#访问IIS,当请求链接不包含有/python/时,就转向到IIS中
location / {
proxy_pass http:127.0.0.1 : 8888 #IIS中网站配置的IP和端口
}
}

至此,我们就完成了Nginx反向代理使用IIS,使其可以同时在同一端口上访问ASP.NET MVC和Python

(补充)Nginx反向代理IIS,IIS如何获取客户端真实IP
1、修改Nginx的nginx.conf文件,添加以下四行代码

<span style=”white-space:pre”> </span>proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

server {
listen 80;
server_name test.com;
#此处的location配置访问服务器上的py
location ^ ~ /python/ {
#fastcgi_pass unix: /tmp/python – cgi.sock;
fastcgi_pass 127.0.0.1 : 8008;#此处的ip及端口会在接下来的py文件中监听使用
#下面三句不用改动
fastcgi_param SCRIPT_FILENAME “”;
fastcgi_param PATH_INFO $fastcgi_script_name;
include fastcgi.conf
}

#访问IIS,当请求链接不包含有/python/时,就转向到IIS中
location / {
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http:127.0.0.1 : 8888 #IIS中网站配置的IP和端口
}
}

2、在IIS网站的ASP.NET MVC代码中添加如下代码获取客户端的真实IP

#region 获取反向代理时的客户端的IP地址 getClientIP
/// <summary>
/// 获取反向代理时的客户端的IP地址
/// </summary>
/// <returns>返回客户端真实IP</returns>
private string getClientIP()
{
HttpRequestBase request = HttpContext.Request;

string ip = request.Headers.Get(“x-forwarded-for”);

if (ip == null || ip.Length == 0 || string.Equals(“unknown”, ip, StringComparison.OrdinalIgnoreCase))
{
ip = request.Headers.Get(“Proxy-Client-IP”);
}
if (ip == null || ip.Length == 0 || string.Equals(“unknown”, ip, StringComparison.OrdinalIgnoreCase))
{
ip = request.Headers.Get(“WL-Proxy-Client-IP”);

}
if (ip == null || ip.Length == 0 || string.Equals(“unknown”, ip, StringComparison.OrdinalIgnoreCase))
{
ip = request.UserHostAddress;
}
return ip;
}
#endregion

完成以上设置,再重新启动Nginx及IIS,即可在IIS中获取客户端真实IP。

 

Over…

参考资料:

1、http://blog.163.com/sky20081816@126/blog/static/1647610232010824262695/

2、http://blog.csdn.net/cclovett/article/details/26259175

3、http://zhidao.baidu.com/link?url=CdWrjHJ3VLiawbVfjSdB7G8fwzTcypd4qvOyT3xzx3BZG4_G2P_DbTHVSpiMupQQaeFwpajZjckwVkDpg6ZfgpzabZpzofwGjeTks2CCd_e
————————————————
版权声明:本文为CSDN博主「lvfk」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/just_shunjian/article/details/51454346

Nginx +iis反向代理 - 逍遥帝君 - 博客园

mikel阅读(692)

来源: Nginx +iis反向代理 – 逍遥帝君 – 博客园

Nginx +iis反向代理

一:简介

     Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好。

二:此次安装的是一个运行在windows上的反向代理服务器,主要和iis配合使用

直接启动exe文件即可

注意: 文件夹不能含有中文,否则会有错误

三:创建2个测试的文件,发布在iis上

四:修改nginx.conf文件

复制代码
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;
 
    upstream www.aaa.com  { 
        server  127.0.0.1:8081 weight=1; #第一个测试网站
        server  127.0.0.1:8082 weight=1;  #第二个测试网站
    } 

    server {
        listen       8080;#这个原来是80端口,如果80已经被占用需要进行修改
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
            proxy_pass  http://www.aaa.com;#反向代理指向地址        

            
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}
复制代码

 

然后直接启动即可,但是需要注意以上内容中的空格,否则启动失败

 

 1.如果站点使用了session,请求平均分配到两个站点,那么必然存在session共享问题,该如何解决?

  • 使用数据库保存session信息
  • 使用nginx将同一ip的请求分配到固定服务器,修改如下。ip_hash会计算ip对应hash值,然后分配到固定服务器

upstream Jq_one{
server 127.0.0.1:8082 ;
server 127.0.0.1:9000 ;
ip_hash;
}

2.由于请求是经过nginx转发过来的,可以在代码里面获取到用户请求的实际ip地址吗?

  • 答案是肯定的,在localtion节点设置如下请求头信息

#设置主机头和客户端真实地址,以便服务器获取客户端真实IP
proxy_set_header   Host             $host;
proxy_set_header   X-Real-IP        $remote_addr;
proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;

代码里面通过Request.Headers[“X-Real-IP”],就能获取到真实ip

nginx实现静态文件(image,js,css)缓存

  • 在server节点下添加新的localtion
  •  #静态资源缓存设置
    location ~ \.(jpg|png|jpeg|bmp|gif|swf|css)$
    {
    expires 30d;
    root /nginx-1.9.3/html;#root:  #静态文件存在地址,这里设置在/nginx-1.9.3/html下
    break;
    }

这是index页面的代码 <li><img src=”/images/1.jpg”/></li>

主要参考文章:http://www.cnblogs.com/yanweidie/archive/2015/07/19/4658136.html

JS 全屏 - 简书

mikel阅读(849)

来源: JS 全屏 – 简书

实现效果

JS实现浏览器全屏

实现方式对比

1、ActiveXObject 只支持IE

2、FullScreen(HTML方法)支持 Chrome 15 / Firefox Nightly / Safari 5.1
备注:方法二 FullScreen JavaScript API 目前仍是草案,实现这个 API,更确切来说是具有这项功能的浏览器有:Chrome 15 / Firefox Nightly / Safari 5.1。
其他方法:flash特性(google关键字 flash 全屏)

代码示例

<html>
<head>
    <script type="text/javascript" language="javascript"> 
  //方法一:ActiveXObject 只支持IE
  //方法二:FullScreen(HTML方法)支持 Chrome 15 / Firefox Nightly / Safari 5.1
  //备注:方法二 FullScreen Javascript API 目前仍是草案,实现这个 API,更确切来说是具有这项功能的浏览器有:Chrome 15 / Firefox Nightly / Safari 5.1。
   
function fullScreen() { 

  var element= document.documentElement; //若要全屏页面中div,var element= document.getElementById("divID");
  //IE 10及以下ActiveXObject
  if (window.ActiveXObject)
  {
    var WsShell = new ActiveXObject('WScript.Shell') 
    WsShell.SendKeys('{F11}'); 
  }
  //HTML W3C 提议
  else if(element.requestFullScreen) {  
    element.requestFullScreen();  
  }
  //IE11
  else if(element.msRequestFullscreen) {  
    element.msRequestFullscreen();  
  }
  // Webkit (works in Safari5.1 and Chrome 15)
  else if(element.webkitRequestFullScreen ) {  
    element.webkitRequestFullScreen();  
  } 
  // Firefox (works in nightly)
  else if(element.mozRequestFullScreen) {  
    element.mozRequestFullScreen();  
  }  
}  

function fullScreenCall() { 

  var el= document.documentElement; //若要全屏页面中div,var element= document.getElementById("divID");

  //切换全屏
  var rfs = el.requestFullScreen || el.webkitRequestFullScreen || el.mozRequestFullScreen || el.msRequestFullscreen;
  if (typeof rfs != "undefined" && rfs) {
      rfs.call(el);
  } else if (typeof window.ActiveXObject != "undefined") {
      // for Internet Explorer 
      var wscript = new ActiveXObject("WScript.Shell");
      if (wscript != null) {
          wscript.SendKeys("{F11}");
      }
  }
}  

function fullExit(){
  var element= document.documentElement;//若要全屏页面中div,var element= document.getElementById("divID"); 
  //IE ActiveXObject
  if (window.ActiveXObject)
  {
    var WsShell = new ActiveXObject('WScript.Shell') 
    WsShell.SendKeys('{F11}'); 
  }
  //HTML5 W3C 提议
  else if(element.requestFullScreen) {  
    document.exitFullscreen();
  }
 //IE 11
  else if(element.msRequestFullscreen) {  
    document.msExitFullscreen();
  }
  // Webkit (works in Safari5.1 and Chrome 15)
  else if(element.webkitRequestFullScreen ) {  
    document.webkitCancelFullScreen(); 
  } 
  // Firefox (works in nightly)
  else if(element.mozRequestFullScreen) {  
    document.mozCancelFullScreen();  
  } 
}

function fullExitCall(){
  var cfs = document.exitFullscreen || document.webkitCancelFullScreen || document.msExitFullscreen || document.mozCancelFullScreen;
  if (typeof cfs != "undefined" && cfs) {
      cfs.call(document);
  } else if (typeof window.ActiveXObject != "undefined") {
      var wscript = new ActiveXObject("WScript.Shell");
      if (wscript != null) {
          wscript.SendKeys("{F11}");
      }
  }
}
    </script>

</head>
<body>
    <button id="btnFullScreen" onclick="fullScreen()">
        全屏</button>
    <button id="btnfullExit" onclick="fullExit()">
        退出全屏</button>
</body>
</html>

作者:过桥
链接:https://www.jianshu.com/p/624f808440ae
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Sqlserver报错:该伙伴事务管理器已经禁止了它对远程/网络事务的支持_cuihengju8933的博客-CSDN博客

mikel阅读(763)

来源: Sqlserver报错:该伙伴事务管理器已经禁止了它对远程/网络事务的支持_cuihengju8933的博客-CSDN博客

SQLServer执行链接服务器的远程查询报错:该伙伴事务管理器已经禁止了它对远程/网络事务的支持

在远程主机没有开启网络DTC访问。
http://blog.csdn.net/apollokk/article/details/51543349

双方启动MSDTC服务

(1)在windows控制面版–>管理工具–>服务–>Distributed Transaction Coordinator–>属性–>启动
(2)在CMD下运行”net start msdtc”开启服务后正常。

管理工具-组件服务,全部勾选。

OK。
远程查询访问正常。
 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22996654/viewspace-2146331/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/22996654/viewspace-2146331/

Lambda表达式select()和where()的区别 - 小海很友爱 - 博客园

mikel阅读(1000)

来源: Lambda表达式select()和where()的区别 – 小海很友爱 – 博客园

新建一个控制台程序ConsoleApplication1

1、where()用法:必须加条件,且返回对象结果。

static void Main(string[] args)
{
string[] arrays={“asd”,”abc”,”bbb”,”ccc”};
var results = arrays.Where(a=>a.Contains(“b”));//必须加条件,返回对象

foreach(var da in results )
{
Console.WriteLine(da);
}

Console.WriteLine(“按任意键可退出!”);
Console.ReadKey();
}

结果:abc  bbb。

2、select()用法:(1)(a=>a.Value==”22″)加条件查询时,返回bool型结果;(2)(a=>a)没条件返回对象

(1)(a=>a.Value==”22″)加条件查询时,返回bool型结果

static void Main(string[] args)
{
string[] arrays={“asd”,”abc”,”bbb”,”ccc”};
var results = arrays.Select(a => a.Contains(“b”));//1、(a=>a.Value==”22″)加条件查询时,返回bool型结果

foreach(var da in results )
{
Console.WriteLine(da);
}

Console.WriteLine(“按任意键可退出!”);
Console.ReadKey();
}

结果:False  True  True  False

(2)(a=>a)没条件返回对象

static void Main(string[] args)
{
string[] arrays={“asd”,”abc”,”bbb”,”ccc”};
var results = arrays.Select(a => a);//1、(a=>a)没条件,返回所有对象;

foreach(var da in results )
{
Console.WriteLine(da);
}

Console.WriteLine(“按任意键可退出!”);
Console.ReadKey();
}

结果:asd  abc   bbb   ccc 

python3.6引入docx后 ,文件报错 moduleNotFoundError:No module named 'exceptions'_海棠花未眠的博客-CSDN博客

mikel阅读(653)

来源: python3.6引入docx后 ,文件报错 moduleNotFoundError:No module named ‘exceptions’_海棠花未眠的博客-CSDN博客

python3.x版本移除了exceptions模块,但是docx包中引用了该模块

安装最新版python-docx模块即可

以下总结两种常用安装第三方包的方法

方法一:

#1 pip install python-docx安装

pip会自动先安装python-docx的前置需求包lxml,但安装失败。

那么就先 安装 lmxl ,具体方法 cmd 输入 pip install lxml

或者通过下载lxml.whl文件进行安装。

新版本pip已支持wheel格式,如若你的pip版本不支持,那么升级你的pip版本 升级pip具体命令 :python -m pip install –upgrade pip

或者 用以下方法安装wheel。

首先安装whl包:pip install wheel

接着去开发者页面下载lxml的安装包:https://pypi.python.org/pypi/lxml。页面默认是最新版本。

命令行进入安装包所在目录,执行pip install 安装包名称

方法二:
1.下载 python_docx-0.8.6-py2.py3-none-any.whl 地址: http://www.lfd.uci.edu/~gohlke/pythonlibs/

3. 命令行输入pip install python_docx-0.8.6-py2.py3-none-any.whl 重新下载docx包,问题解决。
————————————————
版权声明:本文为CSDN博主「衣服架子」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/huijiaaa1/article/details/80616842

string.Format 异常 输入字符串的格式不正确_zhl71199713的专栏-CSDN博客_输入字符串的格式不正确怎么解决

mikel阅读(577)

来源: string.Format 异常 输入字符串的格式不正确_zhl71199713的专栏-CSDN博客_输入字符串的格式不正确怎么解决

最近做一个项目,在使用string.Format对数据进行整理的时候,一直报错:输入字符串的格式不正确。

纠结了很久。最后终于查了下资料终于知道了问题所在。现在将这个问题记录一下:

 

在代码中,需要将结果以Json格式,输出。最开始报错,写的代码如下:

public void TEST()
{
try
{
string t = “Jim”;
string sresult = string.Format(“{name:\”{0}\”}”, t);//这里报错
Console.Write(sresult);
}
catch (Exception ex)
{
}
}

后来查找了一些资料之后,才知道问题所在。
C# 中使用类似 {0}, {1:yyyy-MM-dd} 这样的格式占位符,如果被格式化字符串本身包含 { 或者 } 怎么办呢?答案是:用两个 { 或者 }连写表示单个。

我的代码问题就出在这个地方。修改之后,就好了,修改后的代码如下:

public void TEST()
{
try
{
string t = “Jim”;
string sresult = string.Format(“{{name:\”{0}\”}}”, t);
Console.Write(sresult);
}
catch (Exception ex)
{
}
}
事实上,很多情况下带特殊含义的字符都是这样转义的:如,

C# 中,当字符串常量带 @ 前导的时候,用两个 ” 连写表示一个 ” (半角双引号)

public void TEST()
{
try
{
string sresult = @”this is “”Jim”””;
string tresult=@”this is ‘Jim'”;
string tresult = @”this is “Jim””;//错误
Console.Write(sresult);
}
catch (Exception ex)
{
}
}
SQL 字符串常量,用两个 ‘ 连写表示一个 ‘ (半角单引号)
DECLARE @str6 varchar(100)
SET @str6 = ‘My UserName is ”Jinglecat”.’
PRINT @str6 — My UserName is ‘Jinglecat’.
正则表达式中用,两个 $ 连写表示一个 $ (dollar)
————————————————
版权声明:本文为CSDN博主「zhl71199713」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhl71199713/article/details/19846571

json格式的字符串使用string.Format()方法报错:输入字符串的格式不正确 - 梨花驿路 - 博客园

mikel阅读(925)

来源: json格式的字符串使用string.Format()方法报错:输入字符串的格式不正确 – 梨花驿路 – 博客园

解决:把大括号转义一下就可以了啊,大括号的转义是两个{{  结尾是}}

 

 

今天看同事写的代码,发现他在使用string.format拼接类似json格式的数据时,大括号多了一对,感觉不对就查了查msdn,如下:

转义大括号

左大括号和右大括号被解释为格式项的开始和结束。因此,必须使用转义序列显示文本左大括号或右大括号。在固定文本中指定两个左大括号 (“{{“) 以显示一个左大括号 (“{“),或指定两个右大括号 (“}}”) 以显示一个右大括号 (“}”)。按照在格式项中遇到大括号的顺序依次解释它们。不支持解释嵌套的大括号。

解释转义大括号的方式会导致意外的结果。例如,考虑要显示一个左大括号、一个格式化为十进制数的数值和一个右大括号的格式项“{{{0:D}}}”。但是,实际是按照以下方式解释该格式项:

前两个左大括号 (“{{“) 被转义,生成一个左大括号。

之后的三个字符 (“{0:”) 被解释为格式项的开始。

下一个字符 (“D”) 将被解释为 Decimal 标准数值格式说明符,但后面的两个转义大括号 (“}}”) 生成单个大括号。由于得到的字符串 (“D}”) 不是标准数值格式说明符号,所以得到的字符串会被解释为用于显示字符串“D}”的自定义格式字符串。

最后一个大括号 (“}”) 被解释为格式项的结束。

显示的最终结果是字符串“{D}”。不会显示本来要格式化的数值。

在编写代码时,避免错误解释转义大括号和格式项的一种方法是单独格式化大括号和格式项。也就是说,在第一个格式化操作中显示文本左大括号,在下一操作中显示格式项的结果,然后在最后一个操作中显示文本右大括号。