初探原生js根据json数据动态创建table

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<style type="text/css">
table
{
padding: 0;
margin: 0;
border-collapse: collapse;
}

td
{
border: 1px solid #009999;
padding: 6px 6px 6px 12px;
color: #4f6b72;
text-align: center;
}

td button
{
font-size: 12px;
}
</style>
<script type="text/javascript">
/*
createTable(toid, jsondata, check, edit, del):用于动态创建table,第0行为表头,数据里必须包含表头和数据的id
@toid:创建table到id为toid的节点下
@jsondata:用于创建table的json格式的数据(须在jsondata里包含表头标题)
@check:是否创建查看按钮
@edit:是否创建编辑按钮
@del:是否创建删除按钮
*/
function createTable(toid, jsondata, check, edit, del) {
var table = document.createElement("table");
var tr, td;
for (i in jsondata) {
tr = document.createElement("tr"); //创建tr
//________________创建表头________________________________________
if (i == 0) {
for (j in jsondata[i]) { //根据数据在tr内创建td
td = document.createElement("td");
td.appendChild(document.createTextNode(jsondata[i][j]));
if (j == "id") { //创建隐藏的td来存放id
td.style.display = "none";
}
td.style.background = "#C1DAD7"; //设置表头颜色
tr.appendChild(td);
}
if (check == true) { //创建查看按钮
td = document.createElement("td");
td.appendChild(document.createTextNode("查看"));
td.style.background = "#C1DAD7"; //设置表头颜色
tr.appendChild(td);
}
if (edit == true) { //创建编辑按钮
td = document.createElement("td");
td.appendChild(document.createTextNode("编辑"));
td.style.background = "#C1DAD7"; //设置表头颜色
tr.appendChild(td);
}
if (del == true) { //创建删除按钮
td = document.createElement("td");
td.appendChild(document.createTextNode("删除"));
td.style.background = "#C1DAD7"; //设置表头颜色
tr.appendChild(td);
}
}
//________________创建数据行________________________________________
else {
for (j in jsondata[i]) { //根据数据在tr内创建td
td = document.createElement("td");
td.appendChild(document.createTextNode(jsondata[i][j]));
if (j == "id") { //创建隐藏的td来存放id
td.style.display = "none";
}
tr.appendChild(td);
}
if (check == true) { //创建查看按钮
td = document.createElement("td");
var btnCheck = document.createElement("button");
btnCheck.appendChild(document.createTextNode("查看"));
td.appendChild(btnCheck);
tr.appendChild(td);
}
if (edit == true) { //创建编辑按钮
td = document.createElement("td");
var btnEdit = document.createElement("button");
btnEdit.appendChild(document.createTextNode("编辑"));
td.appendChild(btnEdit);
tr.appendChild(td);
}
if (del == true) { //创建删除按钮
td = document.createElement("td");
var btnDel = document.createElement("button");
btnDel.appendChild(document.createTextNode("删除"));
td.appendChild(btnDel);
tr.appendChild(td);
}
}
table.appendChild(tr);
}
document.getElementById(toid).appendChild(table);
}
</script>
<script type="text/javascript">
var testData = eval("([{\"No\":\"序号\",\"name\":\"姓名\",\"gender\":\"性别\",\"age\":\"年龄\"},{\"No\":\"1\",\"name\":\"小五毛\",\"gender\":\"男\",\"age\":\"22\"},{\"No\":\"2\",\"name\":\"中五毛\",\"gender\":\"女\",\"age\":\"18\"},{\"No\":\"3\",\"name\":\"大五毛\",\"gender\":\"男\",\"age\":\"20\"}])");
window.onload = function () {
createTable("data", testData, true, true, true);
}
</script>
</head>
<body>
<div id="data">
</div>
</body>
</html>

动态生成table的demo

js实现table导出Excel,保留table样式

浏览器环境:谷歌浏览器

1.在导出Excel的时候,保存table的样式,有2种方法,①是在table的行内写style样式,②是在模板里面添加样式

2.第一种方式:行内添加样式

  <td style="font-size: 18px">公司一</td>
完整代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
table td {
font-size: 12px;
width: 200px;
height: 30px;
text-align: center;
background-color: #4f891e;
color: #ffffff;
}
</style>
</head>
<body>
<a download="table导出Excel" id="excelOut" href="#">table导出Excel</a>
<table cellspacing="0" cellpadding="0" border="1" id="tableToExcel">
<thead>
<tr>
<td style="font-size: 18px">公司一</td>
<td>公司二一</td>
<td>公司三</td>
</tr>
</thead>
<tbody>
<tr>
<td>A公司</td>
<td>B公司</td>
<td>C公司</td>
</tr>
<tr>
<td>A公司</td>
<td>B公司</td>
<td>C公司</td>
</tr>
<tr>
<td>A公司</td>
<td>B公司</td>
<td>C公司</td>
</tr>
<tr>
<td colspan="3">共计</td>
</tr>
</tbody>
</table>
<script>
window.onload = function () {
tableToExcel('tableToExcel', '下载模板')
};
//base64转码
var base64 = function (s) {
return window.btoa(unescape(encodeURIComponent(s)));
};
//替换table数据和worksheet名字
var format = function (s, c) {
return s.replace(/{(\w+)}/g,
function (m, p) {
return c[p];
});
}
function tableToExcel(tableid, sheetName) {
var uri = 'data:application/vnd.ms-excel;base64,';
var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"' +
'xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'
+ '<x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>'
+ '</x:ExcelWorkbook></xml><![endif]-->' +
' <style type="text/css">' +
'table td {' +
'border: 1px solid #000000;' +
'width: 200px;' +
'height: 30px;' +
' text-align: center;' +
'background-color: #4f891e;' +
'color: #ffffff;' +
' }' +
'</style>' +
'</head><body ><table class="excelTable">{table}</table></body></html>';
if (!tableid.nodeType) tableid = document.getElementById(tableid);
var ctx = {worksheet: sheetName || 'Worksheet', table: tableid.innerHTML};
document.getElementById("excelOut").href = uri + base64(format(template, ctx));
}

</script>
</body>
</html>

3.第二种方式:在模板里面里面添加样式

在这里面添加的样式excel就能找到和识别了

var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"' +
'xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'
+ '<x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>'
+ '</x:ExcelWorkbook></xml><![endif]-->' +
' <style type="text/css">' +
'table td {' +
'border: 1px solid #000000;' +
'width: 200px;' +
'height: 30px;' +
' text-align: center;' +
'background-color: #4f891e;' +
'color: #ffffff;' +
' }' +
'</style>' +
'</head><body ><table class="excelTable">{table}</table></body></html>';

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
table td {
font-size: 12px;
width: 200px;
height: 30px;
text-align: center;
background-color: #4f891e;
color: #ffffff;
}
</style>
</head>
<body>
<a download="table导出Excel" id="excelOut" href="#">table导出Excel</a>
<table cellspacing="0" cellpadding="0" border="1" id="tableToExcel">
<thead>
<tr>
<td >公司一</td>
<td>公司二一</td>
<td>公司三</td>
</tr>
</thead>
<tbody>
<tr>
<td>A公司</td>
<td>B公司</td>
<td>C公司</td>
</tr>
<tr>
<td>A公司</td>
<td>B公司</td>
<td>C公司</td>
</tr>
<tr>
<td>A公司</td>
<td>B公司</td>
<td>C公司</td>
</tr>
<tr>
<td colspan="3">共计</td>
</tr>
</tbody>
</table>
<script>
window.onload = function () {
tableToExcel('tableToExcel', '下载模板')
};
//base64转码
var base64 = function (s) {
return window.btoa(unescape(encodeURIComponent(s)));
};
//替换table数据和worksheet名字
var format = function (s, c) {
return s.replace(/{(\w+)}/g,
function (m, p) {
return c[p];
});
}
function tableToExcel(tableid, sheetName) {
var uri = 'data:application/vnd.ms-excel;base64,';
var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel"' +
'xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet>'
+ '<x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets>'
+ '</x:ExcelWorkbook></xml><![endif]-->' +
' <style type="text/css">' +
'table td {' +
'border: 1px solid #000000;' +
'width: 200px;' +
'height: 30px;' +
' text-align: center;' +
'background-color: #4f891e;' +
'color: #ffffff;' +
' }' +
'</style>' +
'</head><body ><table class="excelTable">{table}</table></body></html>';
if (!tableid.nodeType) tableid = document.getElementById(tableid);
var ctx = {worksheet: sheetName || 'Worksheet', table: tableid.innerHTML};
document.getElementById("excelOut").href = uri + base64(format(template, ctx));
}

</script>
</body>
</html>

完整代码

js-实现字典(键值存储)

字典,我们使用[键,值] 的形式来存储数据。

js代码如下 :

function Dictionary(){//字典类
var items={};//存储在一个Object的实例中

this.has=function(key){//验证一个key是否是items对象的一个属性
return key in items;
};
this.set=function(key,value){//设置属性
items[key]=value;
};
this.remove=function(key){//移除key属性
if(this.has(key)){
delete items[key];
return true;
}
return false;
};
this.get=function(key){//查找特定属性
return this.has(key) ? items[key]:undefined;
};
this.values=function(){//返回所有value实例的值
var values=new Array();//存到数组中返回
for(var k in items){
if(this.has(k)){
values.push(items[k]);
}
}
return values;
};
this.getItems=function(){//获取
return items;
};
this.clear = function () {//清除
items = {};
};
this.size = function () {//获取属性的多少
return Object.keys(items).length;
};
}
var dictionary= new Dictionary();//new一个对象
//设置属性
dictionary.set('gandalf','gandalf@email.com');
dictionary.set('john','johnsnow@email.com');
dictionary.set('tyrion','tyrion@email.com');
//调用
console.log(dictionary.size());
console.log(dictionary.values());
console.log(dictionary.get('tyrion'));

/*运行结果:
* <span style="white-space:pre"> </span>3
*<span style="white-space:pre"> </span>[ 'gandalf@email.com', 'johnsnow@email.com', 'tyrion@email.com' ]
*<span style="white-space:pre"> </span>tyrion@email.com

————————————————
版权声明:本文为CSDN博主「午夜司令」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u010271602/article/details/50506345

批量修改 sql schema

declare @name sysname

declare csr cursor

for select TABLE_NAME from INFORMATION_SCHEMA.TABLES where table_schema='旧Schema名称'

open csr

FETCH NEXT FROM csr INTO @name

while (@@FETCH_STATUS=0)

BEGIN

SET @name='旧schema名称.' + @name

print 'ALTER SCHEMA 新Schema名称 TRANSFER ' + @name

fetch next from csr into @name

END

CLOSE csr

DEALLOCATE csr
————————————————
版权声明:本文为CSDN博主「wdydxf」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/WDYDXF/article/details/84327556

c# 位运算符

说来惭愧,今天看别人提供的源码,看了这些运算符竟然有些记不起来,在这里就记录一下,

首先认识这些运算符:

& :按位与,其实与&&逻辑运算符有一致的地方,下面会讲到:

| :按位或,同样与||有类似的地方。

~:按位取反

^:按位异或

<<:左移运算符

>>:右移运算符

需要注意的是上面的运算符都是针对Bit(位)进行的运算符,整数或浮点数使用这些运算符会自动进行二进制的位运算。

下面一个个来剖析。

 

&:

我们直接看示例代码:

得到的结果是 :12 ,这个就很有疑问了,我们一点点来看,首先是位运算符会把a和b进行位运算,我们先把两个数转换成二进制:

a  :0000 1101  ,  b: 0000 1110.这两个2进制使用 & 运算符是怎么计算的呢?我们下面来看:

&运算符会对二进制相同位置上面的0和1进行对比,当相同位置数字相同时就返回这个相同的数,否则就返回0,是不是和&&运算符判断两个bool 一致则返回True,否则返回False类似。所以我们得到了result这个结果,转化成十进制就是12了。

 

| :

下面的代码:

 

得到的结果却是15,同样的,我把 | 计算的二进制结果贴出来:

其实判断方式是一样的,只是返回的结果不一样, | 运算符判断两个二进制相同位置的0和1,只要其中一个位置的数字是1就返回1,是不是和 || 运算符同样很类似,只要一个True则返True,再把得到的结果转化成10进制就是15了。

^ :

我们还是看代码:

 

为什么是这个结果了,我们看^对两个二进制数的计算,如图:

 从中可以看出,^ 判断位置上面相同的数字时,如果两个数相同,不论是0还是1都返回0,如果其中一个为1就返回1.而 | 是只要有一个只要位置上一个为1就返回1,所以名字叫异或(不同的返回或)。

 

<< :

还是看代码:

哇,这个结果太不一样了,我们还是看运算的原理图:

可以看出<<运算符之所以叫左移,其实目的就是把符号左边二进制的位置往左边移动右边设置好的格数(我这边是a移动一格,b移动2格),然后往左移动几格后面就补几个0;所以再把得到的结果转成10进制就得到结果。

 

>> :

看看和<<有什么不同:

看看二进制的运算图:

可以看出,<<右移运算符就是把二进制位置上的数字往右边移动指定格数,移动几格就在前面补几个0(后面一篇会讲到进制方面的内容),再把结果转化成10进制。

 

~ : 

把这个留着最后因为比较特别还有点复杂,先看代码:

这个是怎么操作二进制的呢,首先要要记住一些原则,就是正数的反码,补码都是其本身的源码,负数的反码是符号位不变,本身的0变1,1变0,补码就是反码+1,最后进行补码取反时连同符号位一起变得到的反码就是结果:

 

上图中先进行的负数的按位取反操作,首先得到反码,然后负数的补码操作是反码加1,符号位都不变,然后把得到的补码取反(符号位一起取反),得到的反码就是结果,符号位为0,结果得正。

然后进行正数的取反,首先得到正数的补码(源补码,到了这一步就开始了类似与负数取反的操作),把正数的补码进行取反,得到一个新码,既不是反码也不是补码,当做中间值进行操作,对他进行补码,不同的是负数取反是加1,那么正数取反就是减1,再次变更符号位,得到补码,然后将补码取反,得到的反码就是结果。把得到的结果转成十进制要注意,负数的符号位是不参与计算的。

经过多次实验得到一个规律就是:

~(+a)=  -(a+1);(正数按位取反只需要把当前数加1然后改成负的)

~(-a)=   (+a-1);(负数按位取反只需要把当前数先当做正数,然后减1得到结果)

以上是我对~ 的理解,下篇对进制进行解释,包括二进制,八进制,十进制,十六进制
————————————————
版权声明:本文为CSDN博主「pq8888168」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/pq8888168/article/details/82116450

 

项目实战

判断是学校管理员就去掉学校管理员角色

角色添加

navicat 报错2059

如果mysql已经安装完毕,但是可视化工具navicat无法连接本地mysql数据库,报错2059,可以通过下述方法解决。

1.管理员权限发开cmd,进入对应的bin文件夹,并登录mysql

mysql -u root -p
 

2.输入下述命令即可

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'malong1';-----malong1是密码


3.然后再次使用navicat连接本地服务器即可

 

Navicat for MySQL 安装和破解(完美)

https://blog.csdn.net/kt1776133839/article/details/96095702

EF架构~在ef中支持IQueryable级别的Contains被翻译成了Exists,性能可以接受!

不错,非常不错!ef里的contains比linq to sql里的contains有了明显的提升,事实上,是在进行SQL语句翻译上有所提升,在linq to sql里不支持iqueryable的contains集合,它只支持本地集合进行contains,而本地集合的contains会被.net翻译成sql语句是where in (...),即集合有多个元素,在in里就会被列举多少次,这个在性能上是非常低下的,不提倡的,而且它还有长度限制,最多本地集合在linq to sql里是2000多个元素。

ef在这点上表示不错,它为了防止你使用低下的查询,它杜绝你在linq语句中去ToList()对象,这是不错的选择,对于EF中的contains的用法,我们一般是分两步,第一查询出要列举的结果集,但不要ToList(),第二是使用contains语句,当EF把它发到SQL端时,这个语句被翻译成了exist,我们知道,这种查询的性能一定是比where in强的,不说SQL本身就说网络传输,它也一定比前者省了不少,呵呵。

Entityframeworks中正确使用Contains语句的Demo

错误的
var linq = (from data1 in GetUser().Where(i => i.UserID <= 50) select data1.UserID).ToList();

   var linq2 = GetUser_StudyRecord().Where(i => linq.Contains(i.UserID.Value)).ToList();
正确的
 var linq = (from data1 in GetUser().Where(i => i.UserID <= 50) select data1.UserID);//IQueryable<int>,一个查询计划

 var linq2 = GetUser_StudyRecord().Where(i => linq.Contains(i.UserID.Value)).ToList();


实战项目sql
SELECT
[Extent1].[PersonId] AS [PersonId],
[Extent2].[RealName] AS [RealName],
[Extent1].[LoginName] AS [LoginName],
cast(0 as bit) AS [C1],
[Extent2].[Mobile] AS [Mobile],
[Extent2].[Email] AS [Email],
[Extent1].[Password] AS [Password],
[Extent2].[PersonType] AS [PersonType],
[Extent2].[SmallImgPath] AS [SmallImgPath],
cast(0 as bit) AS [C2]
FROM [dbo].[Logins] AS [Extent1]
INNER JOIN [dbo].[People] AS [Extent2] ON [Extent1].[PersonId] = [Extent2].[ID]
WHERE Extent2.ID IN (1)

优化后

SELECT
[Extent1].[PersonId] AS [PersonId],
[Extent2].[RealName] AS [RealName],
[Extent1].[LoginName] AS [LoginName],
cast(0 as bit) AS [C1],
[Extent2].[Mobile] AS [Mobile],
[Extent2].[Email] AS [Email],
[Extent1].[Password] AS [Password],
[Extent2].[PersonType] AS [PersonType],
[Extent2].[SmallImgPath] AS [SmallImgPath],
cast(0 as bit) AS [C2]
FROM [dbo].[Logins] AS [Extent1]
INNER JOIN [dbo].[People] AS [Extent2] ON [Extent1].[PersonId] = [Extent2].[ID]
WHERE EXISTS (SELECT
2 AS [C1]
FROM ( SELECT DISTINCT
[UnionAll1].[PersonId] AS [C1]
FROM (SELECT
[Extent3].[PersonId] AS [PersonId]
FROM [dbo].[Logins] AS [Extent3]
WHERE [Extent3].[LoginName] = 'admin'
UNION ALL
SELECT
[Extent4].[ID] AS [ID]
FROM [dbo].[People] AS [Extent4]
WHERE ((( CAST( [Extent4].[PersonType] AS int)) & ( CAST( 1 AS int))) <> 1) AND ([Extent4].[Mobile] ='admin')) AS [UnionAll1]
) AS [Distinct1]
WHERE [Distinct1].[C1] = [Extent1].[PersonId]
)