Cursor 全自动代码生成器?你还没用过?接下来我就来介绍智能 AI 代码生成工具 Cursor 安装和使用 - 掘金

mikel阅读(799)

来源: Cursor 全自动代码生成器?你还没用过?接下来我就来介绍智能 AI 代码生成工具 Cursor 安装和使用 – 掘金

一、概述

Cursor.so 是一个集成了 GPT-4 的国内直接可以访问的,优秀而强大的免费代码生成器,可以帮助你快速编写、编辑和讨论代码。 它支持多种编程语言,如 Python, Java, C#, JavaScript 等,并且可以根据你的输入和需求自动生成代码片段。 Cursor.so 还可以帮助你重构、理解和优化代码,提高开发效率。

强烈建议程序员们都要安装使用,将带来革命性的编码效率提升。本文简单介绍下 Cursor 的安装和使用。

二、安装

2.1 安装 cursor

官网地址:www.cursor.so/
支持 Mac 、Windows 和 Linux 操作系统,根据自己电脑的系统进行下载。

image.png

界面

首先,Cursor目前是一款独立的应用,界面看 上去像是VS Code, IDE的功能上也明显弱于 VS Code。界面上就三个菜单栏: File、 Edit、 View,然后就是右.上角的4个图标了。这里着 重关注一下View菜单下的Command Palette以 及右.上角的设置图标。

image.png

打开Command Palette之后,可以看到总共有 六个选项,重要的就是其中的4个选项: ●Ctrl+K: 负责代码生成与编辑

●Ctrl+L:负责代码理解和注释

image.png

点击setting按钮,出现一个设置的配置,需要 注意的就是Cursor编辑器支持vim、emacs; 支持绑定COpilot;支持安装不同语言的 server。

image.png

三、使用

image.png

3.1 生成代码

先创建一个 Java 文,然后使用 Ctrl + k 输入想让它生成怎样的代码

image.png 生成出来的代码:

image.png 注意:如果代码生成一半终止,可以重新呼出对话框,输入 “继续” 即可。

3.2 和代码“对话”

可以选择生成的部分代码,去问任何你想问题的问题,让它对代码进行优化。

选择后有两个选项,一个是 Edit ,即告诉它你的诉求,让它帮你修改;一个是 Chat , 即问它相关问题,让它给你解答。

image.png

3.2.1 对话

image.png

image.png 注意:你不仅可以和生成的代码“对话”,也可以将 JDK 、开源项目和自己业务代码贴到这里,进行“对话”,让它解释帮你理解,也可以让它给你改进建议,让它帮你找潜在BUG 等。

3.2.2 修改

image.png

它会根据你的意思进行修改,如果你认为符合要求,点击 Accept 即可生效,否则点击 Reject 拒绝修改。

image.png

点击 Accept 修改成功:

image.png

这个修改不一定是最优的但是基本符合需求。

四、总结

本文只是一个使用 Cursor 的简单示例,帮助大家如何安装和使用。 大家可以根据自己的业务,让它帮你写一些基础的代码,利用好 Cursor 可以大大提高工作效率。

需要注意的是,虽然可以通过语言来生成代码,但目前还不完美,如果生成的代码不太符合要求,可以优化自己的表达,交代再清楚一些;也可以尝试重新生成;还可以通过对话让它不断优化调整以便符合你的要求。 估计未来人工智能将带来开发工具的更大变革。 还有注意数据安全,不要将敏感数据和代码贴出来,以减少泄露风险。而且这些修改和建议只是参考,自己要注意甄别!

作者:小摩尔
链接:https://juejin.cn/post/7214288126222696508
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

layui table组件edit编辑事件获取单元格改之前的值,edit事件中给单元格赋值(附 判断一个js变量是否为数字)_layui edit 判断_面向顶风的博客-CSDN博客

mikel阅读(337)

来源: layui table组件edit编辑事件获取单元格改之前的值,edit事件中给单元格赋值(附 判断一个js变量是否为数字)_layui edit 判断_面向顶风的博客-CSDN博客

layui table组件edit编辑事件获取单元格改之前的值
table.on(‘edit(demo)’,function (obj) {
// 获取单元格编辑之前td的选择器
var selector = obj.tr.selector+’ td[data-field=”‘+obj.field+'”] div’;
// 单元格编辑之前的值
var oldtext = $(selector).text();
alert(oldtext);
});

obj.field就是表头参数的field 这个选择器同样可以用来改变单元格的值
.
.

edit单元格编辑事件中改变单元格的值

如果想要改变在edit单元格编辑事件中改变单元格的值,需要这样
例子
//判断输入的值是否为数字,不是数字提示并赋值回原本的值
table.on(‘edit(demo)’,function (obj) {
//获取编辑前的值
var selector = obj.tr.selector+’ td[data-field=”‘+obj.field+'”] div’;
var oldtext = $(selector).text();
//判断数据类型
if(!isNumber(obj.value)) {
layer.msg(‘请输入数字’);
console.log(oldtext);
// 重点 赋值
$(obj.tr.selector + ‘ td[data-field=”‘ + obj.field + ‘”] input’).val(oldtext);
}
});

之所以要这样赋值,是因为在点击layui table单元格的时候 layui会在td标签下添加一个input输入框,
在输入完成后调用你绑定的edit事件,最后在将input输入框的值覆盖到单元格div 的text里面

说以这样的写法是没有用的:

// 注意这是错误例子
table.on(‘edit(demo)’,function (obj) {
//获取编辑前的值
var selector = obj.tr.selector+’ td[data-field=”‘+obj.field+'”] div’;
var oldtext = $(selector).text();
//判断数据类型
if(!isNumber(obj.value)) {
layer.msg(‘请输入数字’);
console.log(oldtext);
// 赋值
$(obj.tr.selector + ‘ td[data-field=”‘ + obj.field + ‘”] div’).text(oldtext);
}
});

原因是执行顺序,在你edit事件调用

$(obj.tr.selector + ‘ td[data-field=”‘ + obj.field + ‘”] div’).text(oldtext);
1
改变单元格值之后,layui又把input的值覆盖到div,将你对单元格div的赋值覆盖掉了
.
.
对了,附上判断变量是否为数字的isNumber方法

/判断是非数字
function isNumber(val) {
var regPos = /^\d+(\.\d+)?$/; //非负浮点数
var regNeg = /^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$/; //负浮点数
if (regPos.test(val) || regNeg.test(val)) {
return true;
} else {
return false;
}
}
————————————————
版权声明:本文为CSDN博主「面向顶风」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_41746337/article/details/97146486

layui用table.render加载数据 用table.reload重载里面的数据---解决table.render重新加载闪动的问题_itfallrain的博客-CSDN博客

mikel阅读(380)

来源: layui用table.render加载数据 用table.reload重载里面的数据—解决table.render重新加载闪动的问题_itfallrain的博客-CSDN博客

今天在用layui 展示数据的时候,首先想到了table.render这个插件进行数据的展示,因为数据要实时刷新,说到实时刷新,你最低要三秒刷新一次表格的数据吧!!!一开始写了个定时把table.render放到定时函数里面,三秒执行一次函数,那么问题来了,虽然效果是实现了,但这是重新加载表格啊,三秒闪一次,别说是用户了,我都看不下去了,闪的眼疼,就想有没有只让数据重新加载,表格不动。终于功夫不负有心人!!!
tablePlug感觉就是救命稻草,就是解决这个问题的,这也是贤心人性补充吧
下面教你怎么用
1:首先奉上下载这个插件的地址
https://gitee.com/sun_zoro/layuiTablePlug
2:然后找到“下载”文件夹下把tablePlug文件夹复制到你项目的合适位置
3:敲黑板!!!把你项目一开始引入layui modules文件夹下的table.js给替换了(或者你手动修改源码),替换成你从git上下载的那个table.js(这个可能后续不需要修改,现在贤心还没整合!!!)
然后就是引入了

layui.config({base:’static/tablePlug/’}).use([‘table’,’tablePlug’], function(){
var table = layui.table;
var $ = layer.$;
var tablePlug=layui.tablePlug;
tablePlug.smartReload.enable(true);//处理不闪动的关键代码
table.render({
elem: ‘#testone’
, method : ‘POST’
,contentType: ‘application/json’
,url:UrlSchool.oneWen()
,id:”testoneTable”
,smartReloadModel:true
,cellMinWidth: 80 //全局定义常规单元格的最小宽度,layui 2.2.1 新增
,cols: [
[
{field:’deviceName’, title:’设备名称’, width:100}
,{field:’valveStatusName’, title:’阀门状态’, width:120, edit: ‘text’}
]
]
});
// var t1 = window.setInterval(hahahah,3000);
function hahahah(){
// 表格重载
table.reload(‘testoneTable’,{
url:UrlSchool.oneWen()
});
}
});

重点:需要重新加载数据要在table.render中加入 ,smartReloadModel:true(开启)
友情提示:table.reload这个不需要任何改动,组件会根据你reload里面的参数去判断是重新请求数据还是重载!!!
写的应该很详细了,觉得有问题的可以直接参考贤心原文解释!!!
最后的最后给你个贤心博文地址,如果遇到问题这里面有解决办法
https://fly.layui.com/jie/43423/
从这里往下看!!!

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

 EditPlus 格式化HTML JS CSS 教程及edtools分享链接_editplus html代码格式化_Seleey的博客-CSDN博客

mikel阅读(236)

 

来源: (1条消息) EditPlus 格式化HTML JS CSS 教程及edtools分享链接_editplus html代码格式化_Seleey的博客-CSDN博客

首先你得安装一个EditPlus,然后下载你想格式化的xxxformatter.js文件,也就是网上说的EDTOOLS工具包集合,包括html,css,js格式化工具文件。
我的edtools分享链接:
https://pan.baidu.com/s/12fUx8XhkeWsaqucAgLH9Jg 提取码: dm3h

1.:在tools栏—>打开Preferences窗口,点击User tools.

2.按照上图进行,设置。点击Group Name填入”前端开发工具”,
然后Add Tool,填入“html格式化”,填入Command的值
cscript /nologo “D:\software\edTools\htmlFormatter.js”
后面的就是文件工具路径

然后选择Action,

选择标出来的Action的值(第四个选项),
最后操作6,7就可以了。
继续tools

完成了吗,没有,还会出现错误,哈哈,

解决方法:创建reg文件 内容如下 点击运行:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\.js]
@=”JSFile”
“Content Type”=”text/plain”
“PerceivedType”=”text”

[HKEY_CLASSES_ROOT\.js\OpenWithProgids]
“VisualStudio.js.b2b43195″=””
1
2
3
4
5
6
7
8
9
添加注册表成功后,重试一下,就我上面图一样格式化正常了,
尼玛,又乱码了。
解决方法:
1.出现乱码后按Ctrl+Z,回退到乱码前的正常显示状态

2.先把本文档按ANSI编码的先保存一遍(此时不会乱码,此步骤是保证中文不乱码正常显示)

(Editplus的编码设置步骤:

英文版在上边的工具栏找到Document——File Encoding——Convert Encoding——ANSI,

中文版:文件——文件编码——转换编码——选ANSI)

3.再按快捷键让edtools格式化代码(此时不会乱码)

4.再把文档按UTF-8的编码保存一遍
————————————————
版权声明:本文为CSDN博主「Seleey」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44094872/article/details/101988341

 转载editplus格式化js,xml等____附输入错误: 没有文件扩展“.js”的脚本引擎解决_jsformatter.js_大脑袋硕鼠的博客-CSDN博客

mikel阅读(223)

来源: (1条消息) 转载editplus格式化js,xml等____附输入错误: 没有文件扩展“.js”的脚本引擎解决_jsformatter.js_大脑袋硕鼠的博客-CSDN博客

本人一般用editplus写一些小的测试代码或者来研究学习别人的代码,但经常会遇到这些问题:下载过来的HTML/CSS代码混乱,JS代码被压缩,或者是我们想把我们的代码做一下压缩混淆以供发布时使用。当然,对于代码的格式化和代码压缩等,我们都可以使用专有的工具,或者使用一些在线的工作来做,既然EditPlus可以扩展插件,那我们何不利用这一功能来把这些工具集成到EP中呢?

其实很早我都有这些想法,一直没有深究其做法,EP的用户工具组,我一般也是挂些帮助手册之类的供开发时参考。今天在BlueIdea看到有人发了一篇名为“让Editplus自动格式化css和js”的文章,看完后觉得写的很好,我也突然来了灵感,为什么不把前端开发常用工具都集成进去呢?

说做就做,我在网上找了一些相关的工具代码,按照作者的方式开始改造(作者是使用“本地cScript调用JS+EP的文本过滤器”的方式来实现的)。

 

     下面来说下集成的方法(以下以EditPlus3中文版本为例):

      1、下载工具包:edtools.rar ,解压后放到磁盘的一个目录,如D:/edTools。

      2、打开ED,打开“工具”-“用户工具组”,在弹出的对象框中,在“组和工具项目”下拉框中选择一个工具组,点击“组名称”,为该组工具设定一个名称,如“前端开发工具”,如下图所示:

 

 

3、下面开始加入工具,这里主要以JSFormat为例讲解,其它类似。
点击“添加”–“应用程序”,在新建的项中,菜单文本写上名称,如”jsFormat”,在命令里面输入:

 

 

  1. cscript /nologo “D:/edTools/jsFormatter.js”

 

 

后面引号中的内容要修改你磁盘上对应的文件的路径。
在下面的几个选项中,选择“运行为文本过滤”。如下图所示:

 

 

4、其它几个的安装方式与jsFormat的安装类似,这里不再重复。点击ED ,工具你会发现:jsFormat   Ctrl+1,打开一个js点击后你会发现奥秘。

 

 

下载地址: http://download.csdn.net/source/1907530

转自:CSDN:http://blog.csdn.net/misswuyang/article/details/5018143

然后crtl+1格式化错误”输入错误: 没有文件扩展“.js”的脚本引擎。”是因为你js格式文件被别的软件关联了

你可以

如系统中安装了ULTRAEDIT或者E钻加密软件等,就需要去掉关联;

或者如下解决方法:

在运行中输入“regedit”进入注册表,

只需要把[HKEY_CLASSES_ROOT\.js] 项下的那个默认值改成 “JSFile” 就可以正常运行JS 文件了。

ThinkPHP3.2.3扩展之生成PDF文件(MPDF) - 博文 - 手册网

mikel阅读(336)

来源: ThinkPHP3.2.3扩展之生成PDF文件(MPDF) – 博文 – 手册网

先安照路径放好如图。

2016-03-14_144416.gif

下面是使用方法

  1. public function pdf(){
  2.     //引入类库
  3.     Vendor(‘mpdf.mpdf’);
  4.     //设置中文编码
  5.     $mpdf=new \mPDF(‘zh-cn’,‘A4’, 0, ‘宋体’, 0, 0);
  6.     //html内容
  7.     $html=‘<h1><a name=”top”></a>一个PDF文件</h1>’;
  8.     $mpdf->WriteHTML($html);
  9.     $mpdf->Output();
  10.     exit;
  11. }

在浏览器中输入

  1. xxx/index.php?s=/Home/Index/pdf    //换成你的url路径

效果如下

2016-03-14_144911.gif

下面是高级一些的使用方法:

  1. public function pdf(){
  2.         //引入类库
  3.         Vendor(‘mpdf.mpdf’);
  4.         //设置中文编码
  5.         $mpdf=new \mPDF(‘zh-cn’,‘A4’, 0, ‘宋体’, 0, 0);
  6.         $mpdf->SetWatermarkText(‘中国水印’,0.1);
  7.         $strContent = ‘我是带水印的PDF文件’;
  8.         $mpdf->showWatermarkText = true;
  9.         $mpdf->SetHTMLHeader( ‘头部’ );
  10.         $mpdf->SetHTMLFooter( ‘底部’ );
  11.         //$stylesheet =file_get_contents(‘themes/wei/css/bootstrap.min.css’);
  12.         //$mpdf->WriteHTML($stylesheet, 1);
  13.         $mpdf->WriteHTML($strContent);
  14.         //保存ss.pdf文件
  15.         $mpdf->Output(‘ss.pdf’);
  16.         //直接浏览器输出pdf
  17.         $mpdf->Output(‘tmp.pdf’,true);
  18.         $mpdf->Output(‘tmp.pdf’,‘d’);
  19.         $mpdf->Output();
  20.         exit;
  21. }

2016-03-14_150552.gif

mpdf下载可以到官网下载http://www.mpdf1.com 或者在下面的百度云里下载

tcpdf开发文档(中文翻译版) - zh7314 - 博客园

mikel阅读(321)

来源: tcpdf开发文档(中文翻译版) – zh7314 – 博客园

2017年5月3日15:06:15

这个是英文翻译版,我看过作者的文档其实不太友善或者不方便阅读,不如wiki方便

后面补充一些,结构性文档翻译

这是一部官方网站文档,剩余大部分都是开发的时候和网络总结来的

项目官网:https://tcpdf.org/

github:https://github.com/tecnickcom/TCPDF

都没比较完整的api文档,所以最后的demo需要总去总结,好吧

(发现所有例子全部翻译消耗时间过于长,只把其中不同的部分分离出来,也方便读者使用)

 

2018年1月24日09:27:20

发现一个比较大的问题,不算bug,但是是一个比较蛋疼的 问题,当你需要直接将word或者excel的东西,直接获取出来,贴到编辑器,在拿出来,替换内容标签做pdf的时候,

tcpdf需要的是必须闭合的标签,要可以100%转换成xml,不然就报错 Undefined index: startcolumn in tcpdf.php (line 19456)

 

2018年1月29日17:43:18

因为新需要,合同页面变得很复杂,需要支持后端编辑合同模板,又得兼容合同编辑之后,在生成合同

解决办法,找前端直接使用table布局或则div+css,直接把页面写出来在存起来,不然就会报错,虽然麻烦一点,而且也不是那么灵活,但是如果在不随意改变合同模板样式的架构的情况下,还是可以使用的

笔者现在已经尝试了dompdf 但是目前看来这个的中文支持不好,css也好像支持不好,

如果你需要弄复杂页面的合同,请参看 :http://www.cnblogs.com/zx-admin/p/8352003.html

mpdf目前对table布局和div+css布局支持唯一个支持的比较好的插件

 

新增composer 使用tcpdf

composer require tecnickcom/tcpdf
//引入tcpdf
use TCPDF;

我使用laravel是5.4,但是服务上php是5.6但是laravel 这个组件 doctrine/inflector 1.2.x-dev requires php ^7.0

需要的是7,又不好直接服务器上php7,thinkphp最新版的话就直接上7,5.6版本不会出现类似的问题,好吧,我还是觉得tp好使

如果把laravl的计划任务模块,移植到tp上就爽了,有时间在弄这个

 

 

 

Fonts设置字体

注意:以下信息仅对旧的TCPDF库有效。 新的tc-lib-pdf库使用能够即时转换字体的新的tc-lib-pdf-字体库。

TCPDF支持TrueTypeUnicode(UTF-8 Unicode),OpenTypeUnicode,TrueType,OpenType,Type1,CID-0和Core(标准)字体。
有两种使用新字体的方法:将其嵌入PDF(有或没有子集)。 当未嵌入字体时,将在系统中进行搜索。 优点是PDF文件较轻; 另一方面,如果不可用,则使用替换字体。 因此,最好确保在客户端系统上安装所需的字体。 如果该文件要被大量观众查看,建议嵌入。

TCPDF支持字体子集,以减少大型unicode字体文件的文档大小。 如果您将整个字体嵌入到PDF中,则另一端的人即使没有您的字体也可以进行更改。 如果您对字体进行子集,则PDF的文件大小会更小,但是接收PDF的人需要具有相同的字体才能更改PDF。 有关启用/禁用字体子集的选项,请参见SetFont()和AddFont()方法的源代码文档。

可以不嵌入的字体只是标准的核心字体和CID-0字体。

PDF Core(标准)字体是:

  • courier : Courier
  • courierB : Courier Bold
  • courierBI : Courier Bold Italic
  • courierI : Courier Italic
  • helvetica : Helvetica
  • helveticaB : Helvetica Bold
  • helveticaBI : Helvetica Bold Italic
  • helveticaI : Helvetica Italic
  • symbol : Symbol
  • times : Times New Roman
  • timesB : Times New Roman Bold
  • timesBI : Times New Roman Bold Italic
  • timesI : Times New Roman Italic
  • zapfdingbats : Zapf Dingbats

转换TCPDF的字体

使用addTTFfont()方法,您可以直接从TrueType,OpenType或Type1字体创建一个TCPDF字体。
注意:’fonts’文件夹必须由webserver可写。

实例:

$fontname = $pdf->addTTFfont(‘/path-to-font/DejaVuSans.ttf’, ‘TrueTypeUnicode’, “, 32);

检查addTTFfont()的源代码文档以获取更多信息。

设置字体

在配置文件(config / tcpdf_config.php)上将K_PATH_FONTS常量设置为TCPDF字体路径。
在TCPDF类构造函数的第四个参数上,如果使用Unicode字体(true)或旧字体(false),则必须指定。

要在脚本中设置字体,只需调用SetFont()方法即可。 在打印文本或生成的文档无效之前,必须至少调用此方法一次。 该方法可以在创建第一个页面之前调用,字体从页面到页面保留:

SetFont(string family[,string style[,string size]])
  • family : 字体属性 它可以是字体名称或标准系列之一(不区分大小写):
    • Courier (fixed-width)
    • Helvetica or Arial (synonymous; sans serif)
    • Times (serif)
    • Symbol (symbolic)
    • ZapfDingbats (symbolic)

    也可以传递一个空字符串。 在这种情况下,现有的家庭被保留。

  • style : 字体样式。 可能的值是(不区分大小写):
    • empty string: regular
    • B: bold
    • I: italic
    • U: underline

    或任何组合。 默认值为常规值。

  • size:字体大小分。 默认值为当前大小。 如果文档开头没有指定大小,则取值为12。
  • fontfile : 字体定义文件。 默认情况下,名称是从家庭和样式构建的,小写没有空格。
  • subset :如果true只嵌入字体的一个子集(仅存储与所使用字符相关的信息); 如果假嵌入完整字体; 如果’default’使用setFontSubsetting()设置的默认值。 此选项仅对TrueTypeUnicode字体有效。 如果要启用用户更改文档,请将此参数设置为false。 如果您对字体进行分类,那么接收PDF的人将需要使用相同的字体才能更改PDF。 PDF的文件大小也会较小,因为您仅嵌入字体的一部分。

Example:

$pdf->SetFont(‘times’, ‘BI’, 20, “, ‘false’);

Performances(性能)

  • 安装和配置PHP操作码cacher,如XCache;
  • 编辑php.ini文件并增加脚本可能消耗的最大内存量(memory_limit);
  • 编辑php.ini文件并增加每个脚本的最大执行时间(max_execution_time);
  • 编辑config / tcpdf_config.php文件:手动设置$ _SERVER [‘DOCUMENT_ROOT’],K_PATH_MAIN和K_PATH_URL常量,并删除自动计算部分;
  • 如果您不使用泰语,请编辑config / tcpdf_config.php文件并将K_THAI_TOPCHARS常量设置为false;
  • 如果您不需要扩展字符,请编辑config / tcpdf_config.php文件,并将默认字体设置为核心字体;
  • 如果不需要UTF-8 Unicode,则将TCPID构造函数上的unicodefalse�������参数设置为�����,将 encoding参数设置为“ISO-8859-1”或其他字符映射。
  • 默认情况下,TCPDF允许字体子集减少嵌入式Unicode TTF字体的大小,这个过程非常慢,需要大量内存,可以使用setFontSubsetting(false)方法关闭;
  • 尽可能使用核心字体而不是嵌入字体;
  • 如果不严格要求,避免使用HTML语法(writeHTML和writeHTMLCell方法)
  • 拆分较小的大块HTML块;
  • 如果不严格要求,避免使用翻译;
  • 更改后重新启动网络服务器。

 

api使用分析实例

 

 

//去掉默认的页头页脚。比如那个横线
$pdf->setPrintHeader(false);
$pdf->setPrintFooter(false);

 

//设置一个单元格,可以按比例缩放单元格大小
$pdf->Cell(0, 0, 'TEST CELL STRETCH: no stretch', 1, 1, 'C', 0, '', 0);

 

 

复制代码
//设置一个单元格,可以按比例缩放单元格大小
$pdf->Cell(0, 0, 'TEST CELL STRETCH: no stretch', 1, 1, 'C', 0, '', 0);


// 设置背景填充色
$pdf->SetFillColor(220, 255, 220);

/*
*此方法允许以换行符打印文本。
*它们可以是自动的(一旦文本到达单元格的右边界)或显式(通过\ n字符)。 输出所需的多个单元格,一个低于另一个。<br />
*文本可以对齐,居中或对齐。 单元格块可以框架并绘制背景
 */
//设置一个text文本块
$pdf->MultiCell(55, 5, '[LEFT] '.$txt, 1, 'L', 1, 0, '', '', true);
复制代码

 

 

 个人demo实例

注意pdf不是完全支持html标签,所以如果你的写入pdf的是html内容请使用txt或者qq对话框,过滤掉多数的html,

不然写入pdf就会异常,但是是openXML就不会有这个问题,写入word就没任何问题

 

复制代码
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
            $pdf->setPrintHeader(false);    //页面头部横线取消
            $pdf->setPrintFooter(false); //页面底部更显取消
            $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);//自动分页
            $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);//设置页面margin
            $pdf->SetFont('stsongstdlight', '', 12);//设置字体,注意在循环里面一定要把new都一起放在循环里面,不然会报错,没有设置字体,因为这个需要上下文来读取配置
            $pdf->AddPage();//增加一个页面
            $pdf->setCellPaddings(0, 0, 0, 0);//设置一个单元格的padding
            //追加用户亲笔签名到文件底部
            $identify = $v['identify'];
            $contract = M("contract")->where(array("identify" => "$identify"))->find();
            $file = M("file")->where(array("file_id" => $contract['contract_sign_pic_file_id']))->find();
            $sign_pic_url = app_standard_path_new($file['file_path']);

            //tcpdf支持远程图片,所以不用麻烦

            $pdf->writeHTML($contract_content, $ln = true, $fill = false, $reseth = false, $cell = false, $align = '1');//这个如果里面有远程图片,不能直接获取,需要在代码本地才行,把

            $pdf->writeHTML('<b>用户签名</b><br>', $ln = true, $fill = false, $reseth = false, $cell = false, $align = '1');

            $pdf->Image($sign_pic_url, '', '', '40%', '40%', '', '', 'T', false, 300, '', false, false, 1, false, false, false);
//这个可以获得远程图片地址,但是注意它一定是可以在公网可以访问或者授权的
//如果怕图片太大也是可以安比例缩小,放大的

// i 输出到浏览器,D下来php://output S保存
contractdata=������������=pdf->Output($file_name, ‘S’);

file_put_contents(tmpname,�������,contract_data);//所以写入你想写入的地方的文件

 


复制代码

 

新增实例,吧图片章浮动到文字上面demo

2018年1月17日11:34:27

 

例子的官方地址  https://tcpdf.org/examples/

 

Example 001 : first example with default Header and Footer  第一个例子设置默认页眉和页脚的

 

复制代码
<?php

// Include the main TCPDF library (search for installation path).
require_once('./tcpdf/tcpdf.php');

// create new PDF document
$pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

// set document information
$pdf->SetCreator(PDF_CREATOR); //设置创建者
$pdf->SetAuthor('Nicola Asuni'); //设置作者
$pdf->SetTitle('TCPDF Example 001'); //设置文件的title
$pdf->SetSubject('TCPDF Tutorial'); //设置主题
$pdf->SetKeywords('TCPDF, PDF, example, test, guide'); //设置关键词
// set default header data
$pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE . ' 001', PDF_HEADER_STRING, array(0, 64, 255), array(0, 64, 128)); //设置头部,比如header_logo,header_title,header_string及其属性
$pdf->setFooterData(array(0, 64, 0), array(0, 64, 128));

// set header and footer fonts
$pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN)); //设置页头字体
$pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA)); //设置页尾字体
// set default monospaced font
$pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED); //设置默认等宽字体
// set margins
$pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT); //设置margins 参考css的margins
$pdf->SetHeaderMargin(PDF_MARGIN_HEADER); //设置页头margins
$pdf->SetFooterMargin(PDF_MARGIN_FOOTER); //设置页脚margins
// set auto page breaks
$pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM); //设置自动分页
// set image scale factor
$pdf->setImageScale(PDF_IMAGE_SCALE_RATIO); //设置调整图像自适应比例
// set some language-dependent strings (optional) 设置一些与语言相关的字符串
if (@file_exists(dirname(__FILE__) . '/lang/eng.php')) {
    require_once(dirname(__FILE__) . '/lang/eng.php');
    $pdf->setLanguageArray($l);
}

// ---------------------------------------------------------
// set default font subsetting mode
$pdf->setFontSubsetting(true); //设置默认字体子集模式
// Set font
// dejavusans is a UTF-8 Unicode font, if you only need to
// print standard ASCII chars, you can use core fonts like
// helvetica or times to reduce file size.
$pdf->SetFont('dejavusans', '', 14, '', true); //设置字体
// Add a page
// This method has several options, check the source code documentation for more information.
$pdf->AddPage(); //增加一个页面
// set text shadow effect  设置文字阴影效果
$pdf->setTextShadow(array('enabled' => true, 'depth_w' => 0.2, 'depth_h' => 0.2, 'color' => array(196, 196, 196), 'opacity' => 1, 'blend_mode' => 'Normal'));

// Set some content to print
$html = <<<EOD
<h1>Welcome to <a href="http://www.tcpdf.org" style="text-decoration:none;background-color:#CC0000;color:black;">&nbsp;<span style="color:black;">TC</span><span style="color:white;">PDF</span>&nbsp;</a>!</h1>
<i>This is the first example of TCPDF library.</i>
<p>This text is printed using the <i>writeHTMLCell()</i> method but you can also use: <i>Multicell(), writeHTML(), Write(), Cell() and Text()</i>.</p>
<p>Please check the source code documentation and other examples for further information.</p>
<p style="color:#CC0000;">TO IMPROVE AND EXPAND TCPDF I NEED YOUR SUPPORT, PLEASE <a href="http://sourceforge.net/donate/index.php?group_id=128076">MAKE A DONATION!</a></p>
EOD;

/*
 * 
  此方法允许以换行符打印文本。
  它们可以是自动的(一旦文本到达单元格的右边界)或显式(通过\ n字符)。 输出所需的许多单元,一个低于另一个。
    文本可以对齐,居中或对齐。 单元格块可以框架并绘制背景。
 */

// Print text using writeHTMLCell() 
$pdf->writeHTMLCell(0, 0, '', '', $html, 0, 1, 0, true, '', true); //使用writeHTMLCell打印文本
// ---------------------------------------------------------
// Close and output PDF document
// This method has several options, check the source code documentation for more information.
$pdf->Output('example_001.pdf', 'I'); //I输出在浏览器上

//============================================================+
// END OF FILE
//============================================================+
复制代码

 

Example 002 : without Header and Footer  取消页眉和页脚

 

Example 003 : custom Header and Footer  自定义页眉和页脚

Example 004 : text Stretching with Cell()

Example 005 : Multicell()

Example 006 : WriteHTML()

Example 007 : independent columns with WriteHTMLCell()

Example 008 : external UTF-8 Unicode text file

Example 009 : Image()

Example 010 : text on multiple columns

Example 011 : table with primitive methods

Example 012 : graphic methods

Example 013 : graphic transformations

Example 014 : forms and JavaScript

Example 015 : index with Bookmarks()

Example 016 : document encryption

Example 017 : independent columns with MultiCell()

Example 018 : Persian and Arabic language on RTL document

Example 019 : alternative config file

Example 020 : complex alignment with Multicell()

Example 021 : writeHTML() text flow

Example 022 : CMYK colors

Example 023 : page groups

Example 024 : object visibility with setVisibility() and layers with startLayer()

Example 025 : object transparency with SetAlpha()

Example 026 : text clipping

Example 027 : 1D barcodes

Example 028 : multiple page formats

Example 029 : Set PDF viewer display preferences with setViewerPreferences()

Example 030 : colour gradients

Example 031 : pie chart graphic

Example 032 : EPS/AI vectorial image with ImageEPS()

Example 033 : mixed font types (TrueType Unicode, core, CID-0)

Example 034 : clipping masks

Example 035 : border styles with SetLineStyle()

Example 036 : PDF text annotations

Example 037 : spot colors

Example 038 : unembedded CID-0 CJK font

Example 039 : HTML text justification

Example 040 : booklet mode (double-sided pages)

Example 041 : file attachment

Example 042 : image with transparency (alpha channel)

Example 043 : disk caching

Example 044 : move, copy and delete pages

Example 045 : table of contents

Example 046 : text hyphenation

Example 047 : transactions and UNDO

Example 048 : HTML tables with header and rowspan

Example 049 : call TCPDF methods in HTML

Example 050 : 2D barcodes (QR-Code, Datamatrix ECC200 and PDF417)

Example 051 : image as a page background

Example 052 : digital signature certification

Example 053 : JavaScript functions

Example 054 : XHTML form

Example 055 : core fonts dump

Example 056 : crop marks and registration marks

Example 057 : vertical alignment and metrics on Cell()

Example 058 : SVG vectorial image with ImageSVG()

Example 059 : table of contents with HTML templates

Example 060 : advanced page settings

Example 061 : XHTML + CSS

Example 062 : XObject templates

Example 063 : text stretching and spacing (tracking/kerning)

Example 064 : no-write page regions

Example 065 : PDF/A-1b (ISO 19005-1:2005) document

Dapper简明教程 - 简书

mikel阅读(510)

来源: Dapper简明教程 – 简书

Dapper是一款轻量级的ORM框架,有关Dapper优缺点的文章网上一大堆,这里小编就不再赘述啦。下面直接进入正题:

使用前准备

  • 添加对Dapper的引用

在使用Dapper之前,我们要首先添加对Dapper的引用,这里小编使用NuGet来添加引用。因为小编使用的是MySQL数据库,所以也要在项目中添加对MySQL.Data的引用。

Dapper是一款ORM框架,用于数据表和实体模型间的映射,所以在使用前我们还需要创建数据表和实体模型。

  • 创建数据表

CREATE TABLE `t_schools` (
`Id`  int(11) NOT NULL AUTO_INCREMENT ,
`Name`  varchar(20)  NOT NULL ,
`Address`  varchar(50)  NOT NULL ,
PRIMARY KEY (`Id`)
)

CREATE TABLE `t_students` (
`Id`  int(11) NOT NULL AUTO_INCREMENT ,
`Name`  varchar(15) NOT NULL ,
`Number`  varchar(15)  NOT NULL ,
`SchoolId`  int(11) NOT NULL ,
`Gender`  enum('男','女','保密') NOT NULL ,
PRIMARY KEY (`Id`)
)
  • 创建模型

class School
{
    /*
      若属性名和数据库字段不一致(不区分大小写)则查询不出数据,如果使用EF则可以通过Column特性
      建立属性和数据表字段之间的映射关系,Dapper则不行
    */
    //[Column("Name")]
    public string Title { set; get; }
    public string Address { set; get; }
}

class Student
{
    public string Name { set; get; }
    public string Number { set; get; }
    public int SchoolId { set; get; }
}

Dapper的基本用法

const string _connectionString = "Database=Dapper;Data Source=127.0.0.1;User Id=root;Password=root;pooling=false;CharSet=utf8;port=3306;";
using (IDbConnection dbConnection = new MySqlConnection(_connectionString))
{
    dbConnection.Open();
    //通过匿名类型插入单条数据
    dbConnection.Execute("insert into t_schools(Name,Address) values(@Name,@Address)", new { Name = "西南大学", Address = "重庆市北碚区天生路2号" });
    //批量插入数据
    List<School> schools = new List<School>()
    {
      new School() {Address="China·BeiJing",Title="清华大学" },
      new School() {Address="杭州",Title="浙江大学" },
      new School() {Address="不知道,US?",Title="哈弗大学" }
    };
    //在执行参数化的SQL时,SQL中的参数(如@title可以和数据表中的字段不一致,但要和实体类型的属性Title相对应)
    dbConnection.Execute("insert into t_schools(Address,Name) values(@address,@title);", schools);
    //通过匿名类型批量插入数据
    dbConnection.Execute("insert into t_schools(Address,Name) values(@address,@name)", 
    new[] {
      new {Address="杨浦区四平路1239号",Name="同济大学"},
      new {Address="英国",Name="剑桥"},
      new {Address="美国·硅谷",Name="斯坦福大学"}
    });
}

使用Dapper进行查询操作

默认情况下Dapper会将查询到的整个数据集放到内存中,可以在Query方法中通过参数buffered来设置是否将查询结果存放到内存中

  • 查询结果映射到强类型

var schools = dbConnection.Query<School>("select * from t_schools where Name=@name", new { Name = "西南大学" });
foreach (var school in schools)
{
    Console.WriteLine(school.Address);
}
查询变量

有上图我们可以看到,因为School类中的Title属性在数据库中没有与之对应的字段,所以Title的值为null。

查询结果
  • 查询结果映射到匿名类型

在上面的查询中,我们将查询结果映射到了自定义的类型上。除了将查询结果映射到强类型之外,Dapper中还提供了匿名查询方式。

//查询结果result是匿名类型
var result = dbConnection.Query("select * from t_schools limit 0,3");
var resultList = result.AsList();
foreach (var l in resultList)
{
    Console.WriteLine(l.Name);
}
查询结果
  • in

var result = dbConnection.Query<Student>("select * from t_students where SchoolId in @schoolId", new { schoolId = new int[] { 2, 3 } });
foreach (var r in result)
{
    var ps = r.GetType().GetProperties();
    foreach (var p in ps)
    {
        Console.Write(p.Name + "=" + p.GetValue(r) + " ");
    }
    Console.WriteLine();
}
查询结果
  • between

var result = dbConnection.Query<School>("select Name,Address from t_schools where Id between @start and @end", new { start = 2, end = 4 });
foreach (var r in result)
{
    var ps = r.GetType().GetProperties();
    foreach (var p in ps)
    {
        Console.Write(p.Name + "=" + p.GetValue(r) + " ");
    }
    Console.WriteLine();
}
查询结果
  • join

使用join查询时需要用到Query方法中的splitOn参数,话说这个参数让小编纠结了很久才弄明白。关于splitOn参数的说明,可参考stackoverflow上的一篇文章Correct use of Multimapping in Dapper

var result = dbConnection.Query<Student, School, string>("select s.Name,sc.Address from t_students s,t_schools sc where s.SchoolId=sc.Id and binary sc.Address like '%BeiJing%'",
    (s, sc) =>
    {
        return s.Name + " " + sc.Address;
    }, 
    /*
    还有一点需要特别注意,泛型参数的顺序必须和SQL语句查询数据表的顺序一致,
    即Student对应t_students表的查询结果s.Name,否则Query方法的查询结果
    可能为null(这点也是困扰小编很久......)
    */
    splitOn: "Address"
    );
foreach (var r in result)
{
    Console.WriteLine(r);
}
查询结果

Dapper执行多条SQL语句

string sql = "select Address from t_schools;select SchoolId from t_students;select Name from t_students";
using (var multipleReader = dbConnection.QueryMultiple(sql))
{
    //一次执行N条SQL语句则最多只能调用N次Read方法,否则抛异常:the reader has been disposed.
    //Dapper读取查询结果数据的顺序必须要和查询语句中的查询顺序一致,否则可能读取不到数据
    var schoolList = multipleReader.Read<School>();
    foreach (var s in schoolList)
    {
        Console.Write(s.Address + " ");
    }
    Console.WriteLine();
    var studentSchools = multipleReader.Read<Student>();
    foreach (var s in studentSchools)
    {
        Console.Write(s.SchoolId + " ");
    }
    Console.WriteLine();
    var studentNames = multipleReader.Read<Student>();
    foreach (var s in studentNames)
    {
        Console.Write(s.Name + " ");
    }
}
查询结果

事务

使用Dapper执行事务倒是没有什么需要特别说明的。

using (IDbTransaction tran = dbConnection.BeginTransaction())
{
    try
    {
        dbConnection.Execute("delete from t_schools where Id=3", transaction: tran);
        throw new Exception();
        tran.Commit();
    }
    catch
    {
        tran.Rollback();
    }
}

存储过程

首先先创建一个存储过程

DROP PROCEDURE IF EXISTS `GetSchoolName`;
CREATE PROCEDURE `GetSchoolName`(in schoolId int,out scname varchar(20))
BEGIN
select `Name` into scname from t_schools where Id=schoolId;
select scname; 
END;

然后在程序中调用存储过程

//在程序中调用存储过程时,存储过程名要小写,传递的参数名要和存储过程中的参数名一致(不区分大小写)
//连接字符串中的数据库名也要小写,否则抛异常:在数据库***中找不到存储过程×××
var parameters = new DynamicParameters();
parameters.Add("@scname", dbType: DbType.String, direction: ParameterDirection.Output);
parameters.Add("schoolid", 6, direction: ParameterDirection.Input);
var result = dbConnection.Query("getschoolname", parameters, commandType: CommandType.StoredProcedure);
执行结果

从上图可以看出,返回值类型是Dapper中定义的DapperRow类型。

结语

  • Dapper是一个轻量级的ORM框架,它是通过扩展IDbConnection接口来实现一系列的功能的。相比EF、NHibernate,它的功能较为简单。
  • Dapper在执行查询语句时会缓存SQL语句的相关信息,这样就保证了Dapper拥有较高的性能(原文:Dapper caches information about every query it runs, this allow it to materialize objects quickly and process parameters quickly)。

以上内容是小编自己的一个学习总结,写出来一是作为自己的学习笔记,二是和广大网友分享。文中若有错误之处,还望各位读者能够指正。

参考文章:

Dapper
Dapper快速学习
Dapper中的一些复杂操作和inner join应该注意的坑
Dapper异常汇总
Correct use of Multimapping in Dapper

16人点赞

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

 Dapper官方文档(一)【介绍】_风神修罗使的博客-CSDN博客

mikel阅读(239)

来源: (4条消息) Dapper官方文档(一)【介绍】_风神修罗使的博客-CSDN博客

什么是Dapper

Dapper是一个简单的.NET对象映射器,在速度方面具有”King of Micro ORM“的头衔,几乎与使用原始的ADO.NET数据读取器一样快。ORM是一个对象关系映射器,它负责数据库和编程语言之间的映射。

Dapper通过扩展IDbConnection提供一些有用的扩展方法去查询您的数据库。

Dapper是如何工作的

它可以分为三个步骤:

  • 创建一个IDbConnection接口对象;
  • 编写一个查询SQL来执行CRUD操作;
  • 将查询SQL作为Execute方法的参数传递。

安装

Dapper通过NuGet安装:https://www.nuget.org/packages/Dapper

PM> Install-Package Dapper
  • 1

要求

Dapper可以与任何数据库提供者一起工作,因为没有数据库特定的实现。

方法

Dapper会用以下几个方法扩展您的IDbConnection接口:

  • Execute
  • Query
  • QueryFirst
  • QueryFirstOrDefault
  • QuerySingle
  • QuerySingleOrDefault
  • QueryMultiple
string sqlInvoices = "SELECT * FROM Invoice;";
string sqlInvoice = "SELECT * FROM Invoice WHERE InvoiceID = @InvoiceID;";
string sp = "EXEC Invoice_Insert";

using (var connection = My.ConnectionFactory())
{
        // 执行普通SQL
    var invoices = connection.Query<Invoice>(sqlInvoices).ToList();
    // 执行带参数的SQL
    var invoice = connection.QueryFirstOrDefault(sqlInvoice, new {InvoiceID = 1});
    // 执行存储过程 
    var affectedRows = connection.Execute(sp, new { Param1 = "Single_Insert_1" }, commandType: CommandType.StoredProcedure);
}

参数

执行和查询方法可以用以下几种不同的方式使用参数:

  • 匿名类型
  • 动态类型
  • 列表类型
  • 字符串类型
// Anonymous
var affectedRows = connection.Execute(sql,
                    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
                    commandType: CommandType.StoredProcedure);

// Dynamic
DynamicParameters parameter = new DynamicParameters();

parameter.Add("@Kind", InvoiceKind.WebInvoice, DbType.Int32, ParameterDirection.Input);
parameter.Add("@Code", "Many_Insert_0", DbType.String, ParameterDirection.Input);
parameter.Add("@RowCount", dbType: DbType.Int32, direction: ParameterDirection.ReturnValue);

connection.Execute(sql,
    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
    commandType: CommandType.StoredProcedure);

// List
connection.Query<Invoice>(sql, new {Kind = new[] {InvoiceKind.StoreInvoice, InvoiceKind.WebInvoice}}).ToList();

// String
connection.Query<Invoice>(sql, new {Code = new DbString {Value = "Invoice_1", IsFixedLength = false, Length = 9, IsAnsi = true}}).ToList();

结果

查询方法返回的结果可以映射到以下几种类型:

  • 匿名类型
  • 强类型
  • 多映射
  • 多结果
  • 多类型
string sql = "SELECT * FROM Invoice;";

using (var connection = My.ConnectionFactory())
{
    connection.Open();

    var anonymousList = connection.Query(sql).ToList();
    var invoices = connection.Query<Invoice>(sql).ToList();
}

工具

  • 异步
  • 缓冲
  • 事务
  • 存储过程
// Async
connection.QueryAsync<Invoice>(sql)

// Buffered
connection.Query<Invoice>(sql, buffered: false)

// Transaction
using (var transaction = connection.BeginTransaction())
{
    var affectedRows = connection.Execute(sql,
        new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
        commandType: CommandType.StoredProcedure,
        transaction: transaction);

    transaction.Commit();
}

// Stored Procedure
var affectedRows = connection.Execute(sql,
    new {Kind = InvoiceKind.WebInvoice, Code = "Single_Insert_1"},
    commandType: CommandType.StoredProcedure);

钉钉 基于vue开发h5微应用,免登录获取用户信息_钉钉微应用免登vue实现_sheen~向阳的博客-CSDN博客

mikel阅读(556)

来源: (1条消息) 钉钉 基于vue开发h5微应用,免登录获取用户信息_钉钉微应用免登vue实现_sheen~向阳的博客-CSDN博客

 

需求
在钉钉里面内嵌一个自定义的h5应用,点击微应用获取到用户信息,实现微应用免登录访问

准备工作,查看钉钉开放平台文档开发H5微应用
免登流程 文档位置
钉钉API总览
vue + 钉钉

先安装 npm install dingtalk-jsapi –save
vue根据钉钉企业id获取微应用免登授权码code

import * as dd from ‘dingtalk-jsapi’

/* eslint-disable */
export function GetCode(callback) {
const corpId = ‘xxxxxxxxx’ //钉钉企业id
if (dd.env.platform !== ‘notInDingTalk’) {
dd.ready(() => {
dd.runtime.permission.requestAuthCode({
corpId: corpId,
onSuccess: (info) => {
callback(info.code)
},
onFail: (err) => {
alert(‘fail’)
alert(JSON.stringify(err))
}
})
})
}
}

使用
import { GetCode } from ‘@/views/dingTalk/Dingding.js’

GetCode((code: any) => {
console.log(code, 123)
})

获取用户信息【建议用户信息保存在前端缓存中(dd.setStorage)或者cookie中,避免每次进入应用都调用钉钉接口进行免登。】

async loadData() {
const userInfos = this.$cookie.get(‘userinfos’)
if (!userInfos) {
await GetCode((code: any) => {
this.serviceType = code
})
// 获取企业内部应用的access_token,
let access_token = await axios
.get(
‘/gettoken?appkey=xxxx&appsecret=xxxx’
)
.then((response: { data: any }) => {
return response.data.access_token
})
.catch((err: Error) => {})
// 通过免登码和access_token获取用户信息
let userId = await axios
.get(
`/user/getuserinfo?access_token=${access_token}&code=${this.serviceType}`
)
.then((res: { data: any }) => {
return res.data.userid
})
.catch((err: Error) => {})
// 通过userId和access_token获取用户详情
axios
.get(`/user/get?access_token=${access_token}&userid=${userId}`)
.then((res: { data: any }) => {
this.message = JSON.stringify(res.data)
this.$cookie.set(‘userinfos’, JSON.stringify(res.data), {
expires: 7
})
})
.catch((err: Error) => {})
} else {
this.message = ‘获取缓存在cookie中的数据’ + userInfos
}
}

vue.config.js 配置

devServer: {
proxy: {
‘/’: {
target: ‘https://oapi.dingtalk.com/’,
autoRewrite: true,
cookieDomainRewrite: {
‘*’: ”
},
pathRewrite: {
[‘^’ + ‘/’]: ”
}
}
}
}
————————————————
版权声明:本文为CSDN博主「sheen~向阳」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40079913/article/details/120198601