文书智能助手

背景

司法、医疗等行业存在着大量的文书,一份文书或者卷宗少则几十页,多则几万页。在查看和检查这些文书时,会遇到大量的信息。当需要查询进一步的详细内容时,往往需要选择一下文字,然后再在各种系统中 查询详细的信息。客户就提出了一个思路:“文书智能助手”。文书智能助手:在Word 或者 记事本 或者 其他软件中,使用鼠标框选选中一段文字后,根据“选中的文字”在各种系统中检索数据,自动显示相关的数据项。并可以向Word插入文字和图片内容。

使用说明

启动程序

在文书中使用鼠标框选中文字

根据“选中的文字”在各种系统中检索数据,自动显示相关的数据项。

word监控工具

 

设计

程序分为主EXE 和DLL

DLL为鼠标HOOK

主EXE在鼠标框选中,获取当前选中的文字,然后进行查询,并显示查询结果。

代码

DLL代码

uses
  windows,
  messages,
  System.SysUtils,
  System.Classes;

{$R *.res}

const
  WM_my_cmd_mouse = WM_USER + 201;
  WM_my_cmd_key = WM_USER + 202;

var
  idhook: longint;
  hNextHookProc: HHook;
  main_handle: THandle = 0;

function KeyboardHookHandler(iCode: Integer; WParam: WParam; lParam: lParam)
  : LRESULT stdcall;
const
  _KeyPressMask = $80000000;
var
  c: char;
  i: Integer;
  j: Integer;
begin

  Result := 0;
  if iCode < 0 then
  begin
    Result := CallNextHookEx(hNextHookProc, iCode, WParam, lParam);
    Exit;
  end;
  if main_handle > 0 then
  begin
    PostMessage(main_handle, WM_my_cmd_key, WParam, lParam);
  end;
  Result := CallNextHookEx(hNextHookProc, iCode, WParam, lParam);
end;

function hookProc(nCode: Integer; // hook code
  WParam: WParam; // message identifier消息标识
  lParam: lParam // mouse coordinates鼠标坐标
  ): LRESULT; stdcall;
var
  x: Integer;
  y: Integer;
  l: DWORD;
begin
  if (WParam = WM_LBUTTONUP) or (WParam = WM_LBUTTONDOWN) then
  begin
    try
      if (WParam = WM_LBUTTONUP) or (WParam = WM_LBUTTONDOWN) then
      begin
        x := PMouseHookStruct(lParam)^.pt.x;
        y := PMouseHookStruct(lParam)^.pt.y;
        l := x * 10000 + y;
        PostMessage(main_handle, WM_my_cmd_mouse, WParam, l);
      end;
    finally
    end;
  end;
  Result := CallNextHookEx(idhook, nCode, WParam, lParam);

  Exit;
end;

function setHook(h: THandle): Boolean; stdcall;
begin
  main_handle := h;
  idhook := SetWindowsHookEx(WH_MOUSE_ll, @hookProc, HInstance, 0);
  // hNextHookProc := SetWindowsHookEx(WH_KEYBOARD, @KeyboardHookHandler,
  // HInstance, 0);
  Result := idhook <> 0;
end;

// 删除鼠标钩子
function delHook: Boolean; stdcall;
begin
  if idhook > 0 then
    UnhookWindowsHookEx(idhook);
  // if hNextHookProc > 0 then
  // UnhookWindowsHookEx(hNextHookProc);
  main_handle := 0;
  Result := true;
end;

exports
  setHook name 'setHook',
  delHook name 'delHook',
  hookProc name 'hookProc',
  KeyboardHookHandler name 'KeyboardHookHandler';

begin

end.

主EXE代码 

unit U_main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.ImageList, Vcl.ImgList,
  Vcl.Menus, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.Buttons, U_Pub, U_makepng, U_img,
  U_btnImg,
  u_btn, U_DocBookMarkMgr, Clipbrd;

const
  WM_my_cmd = WM_USER + 101;
  WM_my_cmd_mouse = WM_USER + 201;
  str_nobookmark = '没有发现书签';

type
  TFrm_main = class(TForm)
    TrayIcon1: TTrayIcon;
    PopupMenu1: TPopupMenu;
    ImageList1: TImageList;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    ImageList2: TImageList;
    Panel1: TPanel;
    BitBtn1: TBitBtn;
    BitBtn2: TBitBtn;
    Label1: TLabel;
    Timer1: TTimer;
    Edit1: TEdit;
    Label3: TLabel;
    Memo1: TMemo;
    Timer_mouse: TTimer;
    Timer_img: TTimer;
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N4Click(Sender: TObject);
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
    procedure N1Click(Sender: TObject);
    procedure TrayIcon1MouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure BitBtn1Click(Sender: TObject);
    procedure BitBtn2Click(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure Timer_mouseTimer(Sender: TObject);
    procedure Timer_imgTimer(Sender: TObject);
  private
    will_exit: Boolean;
    is_timer_word: Boolean;

    LBUTTONDOWN_handle: THandle;
    LBUTTONDOWN_x_last: Integer;
    LBUTTONDOWN_y_last: Integer;
    LBUTTONUP_x_last: Integer;
    LBUTTONUP_y_last: Integer;

    frm_makepng: TFrm_makepng;
    frm_btn: TFrm_btn;
    curr_frm_img: TFrm_btnimg;
    old_clipboard_text: string;
    curr_text: string;
    curr_isimg: Boolean;
    curr_imgfn: string;
  public
    { Public declarations }
    procedure my_cmd(var Message: TMessage); message WM_my_cmd;
    procedure my_cmd_mouse(var Message: TMessage); message WM_my_cmd_mouse;
    procedure do_cmd_mouse(WParam, X, Y: Integer);
    procedure do_init();
    procedure do_word_timer();
    function do_pt_frm_btn(pt: TPoint): Boolean;
    procedure show_btn(pt: TPoint; txt: string; isimg: Boolean);
    procedure show_btn_img(pt: TPoint);
    procedure frm_btnClose(Sender: TObject; var Action: TCloseAction);
    procedure frm_btn_imgClose(Sender: TObject; var Action: TCloseAction);
    procedure do_copy();
    procedure do_typetext(bk, txt: string);
    procedure do_typeimg(bk: string);

  end;

var
  Frm_main: TFrm_main;

implementation

uses activex, comobj, Pub;
{$R *.dfm}

procedure TFrm_main.BitBtn1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_my_cmd, 3, 0);
end;

procedure TFrm_main.BitBtn2Click(Sender: TObject);
begin
  // Hide;
  top := 0 - 10 - Height;
end;

procedure TFrm_main.do_cmd_mouse(WParam, X, Y: Integer);
var
  pt: TPoint;
  x_begin, y_begin: Integer;
  x_end, y_end: Integer;
begin
  try
    if WParam = WM_LBUTTONDOWN then
    begin

      write_log('WM_LBUTTONDOWN');
      if frm_btn <> nil then
      begin
        pt := frm_btn.ScreenToClient(Point(X, Y));
        do_pt_frm_btn(pt);
        LBUTTONDOWN_x_last := X;
        LBUTTONDOWN_y_last := Y;
      end
      else
      begin
        LBUTTONDOWN_x_last := X;
        LBUTTONDOWN_y_last := Y;
        LBUTTONDOWN_handle := GetActiveWindow();
      end;

      if Shift_down() then
      begin
        if curr_frm_img <> nil then
          FreeAndNil(curr_frm_img);
        show_btn_img(Point(X, Y));
      end
      else
      begin
        if curr_frm_img <> nil then
          FreeAndNil(curr_frm_img);
      end;
    end
    else if WParam = WM_LBUTTONUP then
    begin
      if curr_frm_img <> nil then
      begin
        x_begin := curr_frm_img.x_begin;
        y_begin := curr_frm_img.y_begin;
        x_end := curr_frm_img.x_end;
        y_end := curr_frm_img.y_end;
        FreeAndNil(curr_frm_img);

        LBUTTONUP_x_last := X;
        LBUTTONUP_y_last := Y;
        write_log('WM_LBUTTONUP');

        if (x_begin - x_end) * (x_begin - x_end) + (y_begin - y_end) *
          (y_begin - y_end) > 100 then
        begin
          curr_imgfn := frm_makepng.MakeSceenCopyPath(x_begin, y_begin,
            x_end, y_end);
          Timer_img.Enabled := false;
          Timer_img.Interval := 50;
          Timer_img.Enabled := true;
        end
        else
        begin
          if frm_btn <> nil then
            FreeAndNil(frm_btn);
        end;
      end
      else
      begin
        LBUTTONUP_x_last := X;
        LBUTTONUP_y_last := Y;
        write_log('WM_LBUTTONUP');
        Timer_mouse.Enabled := false;
        Timer_mouse.Interval := 100;
        Timer_mouse.Enabled := true;
      end;
    end;

  except
    on e: Exception do
    begin
      write_log('my_cmd_mouse ' + e.Message);
    end;
  end;
end;

procedure TFrm_main.do_copy;
begin
  keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), 0, 0); // 按下Ctrl键
  keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), 0, 0); // 按下C键
  keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), KEYEVENTF_KEYUP, 0); // 放开C键
  keybd_event(VK_Control, MapVirtualKey(VK_Control, 0), KEYEVENTF_KEYUP, 0);
end;

procedure TFrm_main.do_init;
  procedure show_msg(v: string);
  begin
    Memo1.Lines.Add(v);
    Edit1.Text := v;
    Application.ProcessMessages();
    sleep(300);
  end;

begin
  Pub.setHook(Handle);
  show_msg('初始化鼠标监控');
  show_msg('初始化Word服务');
  show_msg('正在监控Word');
  sleep(500);

end;

function TFrm_main.do_pt_frm_btn(pt: TPoint): Boolean;
var
  i: Integer;
  node: TDocBookMarkNodeDraw;
  bookmork: string;
begin
  write_log('do_pt_frm_btn x:' + inttostr(pt.X) + ' y:' + inttostr(pt.Y));
  write_log('do_pt_frm_btn GetCurrentProcessId:' +
    inttostr(GetCurrentProcessId));

  Result := false;
  if frm_btn = nil then
    exit;
  try
    if (pt.Y > frm_btn.Height) or (pt.X > frm_btn.Width) then
    begin
      FreeAndNil(frm_btn);
      exit;
    end;
    if PtInRect(frm_btn.CloseBtn.BoundsRect, pt) then
    begin
      write_log('frm_btn.CloseBtn');
      FreeAndNil(frm_btn);
      exit;
    end;
    for i := 0 to frm_makepng.mgr.DrawList.Count - 1 do
    begin
      node := frm_makepng.mgr.DrawList[i];
      if PtInRect(node.Rect, pt) then
        if node.texttype = 'BookMark' then
        begin
          bookmork := node.BookMark.Name;
          FreeAndNil(frm_btn);
          // Timer_post.Enabled := false;
          // Timer_post.Interval := 500;
          // will_do_bookmork := node.BookMark.Name;
          // Timer_post.Enabled := true;
          Result := true;
          Break;
        end;
    end;
  except
    on e: Exception do
    begin
      write_log('do_pt_frm_btn ' + e.Message);
    end;
  end;
  if bookmork <> str_nobookmark then
  begin
    if curr_isimg then
      do_typeimg(bookmork)
    else if curr_text <> '' then
      do_typetext(bookmork, curr_text);
  end;
end;

procedure TFrm_main.do_typeimg(bk: string);
var
  pvDisp: IDispatch;
  wordApp: OleVariant;
  doc: OleVariant;
  i: Integer;
  s: string;
  rend: OleVariant;
begin
  if not FileExists(curr_imgfn) then
    exit;
  if (GetObject('Word.Application', IDispatch, pvDisp) = S_OK) then
  begin
    wordApp := pvDisp;
    try
      if wordApp.Documents.Count >= 1 then
      begin
        doc := wordApp.ActiveDocument;
        if VarIsNull(doc) then
          doc := wordApp.Documents.Item(1);

        try
          if doc.BookMarks.Exists(bk) then
          begin
            rend := doc.BookMarks.Item(bk).Range.End - 1;
            wordApp.Selection.SetRange(rend, rend);
            wordApp.Selection.InlineShapes.addpicture
              (curr_imgfn, false, true);
            // Word.ActiveDocument.Range.InlineShapes.addpicture(extractfilepath(Application.ExeName)+'\test.jpg',True, True);
          end;
        except
          begin

          end;
        end;
      end;
    except
      begin

      end;
    end;
    rend := Unassigned;
    doc := Unassigned;
    wordApp := Unassigned;
  end;

end;

procedure TFrm_main.do_typetext(bk, txt: string);
var
  pvDisp: IDispatch;
  wordApp: OleVariant;
  doc: OleVariant;
  i: Integer;
  s: string;
  rend: OleVariant;
begin
  if (GetObject('Word.Application', IDispatch, pvDisp) = S_OK) then
  begin
    wordApp := pvDisp;
    try
      if wordApp.Documents.Count >= 1 then
      begin
        doc := wordApp.ActiveDocument;
        if VarIsNull(doc) then
          doc := wordApp.Documents.Item(1);

        try
          if doc.BookMarks.Exists(bk) then
          begin
            rend := doc.BookMarks.Item(bk).Range.End - 1;
            wordApp.Selection.SetRange(rend, rend);
            wordApp.Selection.TypeText(txt);
          end;
        except
          begin

          end;
        end;
      end;
    except
      begin

      end;
    end;
    rend := Unassigned;
    doc := Unassigned;
    wordApp := Unassigned;
  end;

end;

procedure TFrm_main.do_word_timer;
var
  pvDisp: IDispatch;
  wordApp: OleVariant;
  doc: OleVariant;
  doc_filename, s: string;
  sl: TStringList;
  i: Integer;
begin
  sl := TStringList.Create;
  if (GetObject('Word.Application', IDispatch, pvDisp) = S_OK) then
  begin
    wordApp := pvDisp;
    try
      if wordApp.Documents.Count >= 1 then
      begin
        doc := wordApp.ActiveDocument;
        if VarIsNull(doc) then
          doc := wordApp.Documents.Item(1);
        doc_filename := doc.FullName;
        try
          for i := 1 to doc.BookMarks.Count do
            sl.Add(trim(doc.BookMarks.Item(i).Name));
        except
          begin

          end;
        end;
      end;
    except
      begin

      end;
    end;
    doc := Unassigned;
    wordApp := Unassigned;
  end;

  if doc_filename = '' then
  begin
    doc_filename := '没有发现打开的Word文档或Word无响应'
  end;
  frm_makepng.mgr.DocFullName := doc_filename;
  frm_makepng.mgr.clear_BookMarkList;
  for i := 0 to sl.Count - 1 do
  begin
    s := sl[i];
    if pos('_', s) < 1 then
      frm_makepng.mgr.add_BookMark(sl[i]);
  end;
  if frm_makepng.mgr.BookMarkList.Count = 0 then
    frm_makepng.mgr.add_BookMark(str_nobookmark);
  frm_makepng.mgr.MakeDraw;
  FreeAndNil(sl);
end;

procedure TFrm_main.FormActivate(Sender: TObject);
begin
  OnActivate := nil;
  Timer1.Enabled := true;
end;

procedure TFrm_main.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if will_exit then
    exit;
  Action := caHide;
end;

procedure TFrm_main.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  if will_exit then
    exit;
  CanClose := false;
  Hide();

end;

procedure TFrm_main.FormCreate(Sender: TObject);
begin
  is_timer_word := false;
  frm_makepng := TFrm_makepng.Create(nil);
  u_btn.imgpath := GetPath();
  U_makepng.imgpath := u_btn.imgpath;
  frm_btn := nil;
  curr_frm_img := nil;
  write_log('FormCreate');
end;

procedure TFrm_main.FormDestroy(Sender: TObject);
begin
  Pub.delHook();
  try
    if (frm_btn <> nil) then
      FreeAndNil(frm_btn);
    FreeAndNil(frm_makepng);
    if (curr_frm_img <> nil) then
      FreeAndNil(curr_frm_img);
  except

  end;
  write_log('FormDestroy');
end;

procedure TFrm_main.frm_btnClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  frm_btn := nil;
end;

procedure TFrm_main.frm_btn_imgClose(Sender: TObject; var Action: TCloseAction);
begin
  curr_frm_img := nil;
end;

procedure TFrm_main.N1Click(Sender: TObject);
begin
  PostMessage(Handle, WM_my_cmd, 1, 0);
end;

procedure TFrm_main.N4Click(Sender: TObject);
begin
  PostMessage(Handle, WM_my_cmd, 3, 0);
end;

procedure TFrm_main.show_btn(pt: TPoint; txt: string; isimg: Boolean);
var
  h: THandle;
  X, Y, l, t: Integer;
begin
  try
    write_log('show_btn txt:' + txt);
    if (txt = '') and (isimg = false) then
      exit;
    do_word_timer();
    curr_text := txt;
    curr_isimg := isimg;

    h := GetActiveWindow();
    if (frm_btn <> nil) then
      FreeAndNil(frm_btn);
    h := GetActiveWindow();
    LBUTTONDOWN_handle := h;
    // frm_makepng.Test();
    frm_makepng.MakePng(u_btn.imgpath + 'btn.png');
    frm_btn := TFrm_btn.Create(nil);
    frm_btn.OnClose := frm_btnClose;
    X := pt.X;
    Y := pt.Y + 16;

    l := X - frm_btn.Width div 2;
    t := Y;
    if l > Screen.Width - frm_btn.Width then
      l := Screen.Width - frm_btn.Width;
    if t > Screen.Height - frm_btn.Height then
      t := Screen.Height - frm_btn.Height;

    frm_btn.left := l;
    frm_btn.top := t;

    ShowWindow(frm_btn.Handle, SW_NORMAL or SW_SHOWNOACTIVATE);
    Application.ProcessMessages;
    sleep(100);
    Application.ProcessMessages;
    SetForegroundWindow(LBUTTONDOWN_handle);
  except
    on e: Exception do
    begin
      write_log('show_btn ' + e.Message);
    end;
  end;
end;

procedure TFrm_main.show_btn_img(pt: TPoint);
begin
  curr_isimg := false;
  curr_imgfn := '';
  if (curr_frm_img <> nil) then
    FreeAndNil(curr_frm_img);
  frm_makepng.MakeScreenPng();
  U_btnImg.curr_bmpstream := frm_makepng.screen_stream_adapter;

  curr_frm_img := TFrm_btnimg.Create(nil);
  curr_frm_img.x_begin := pt.X;
  curr_frm_img.y_begin := pt.Y;
  curr_frm_img.x_end := pt.X;
  curr_frm_img.y_end := pt.Y;
  curr_frm_img.OnClose := frm_btn_imgClose;

  curr_frm_img.left := 0;
  curr_frm_img.top := 0;

  // ShowWindow(curr_frm_img.Handle, SW_NORMAL or SW_SHOWNOACTIVATE);
  // ShowWindow(curr_frm_img.Handle, SW_NORMAL);
  curr_frm_img.Show;
  Application.ProcessMessages;
  SetForegroundWindow(curr_frm_img.Handle);
end;

procedure TFrm_main.Timer1Timer(Sender: TObject);
begin
  Timer1.Enabled := false;
  do_init();
  top := 0 - 10 - Height;
end;

procedure TFrm_main.Timer_imgTimer(Sender: TObject);
var
  i: Integer;
  X, Y: Integer;
begin
  Timer_img.Enabled := false;
  if ((LBUTTONDOWN_x_last - LBUTTONUP_x_last) *
    (LBUTTONDOWN_x_last - LBUTTONUP_x_last) +
    (LBUTTONDOWN_y_last - LBUTTONUP_y_last) *
    (LBUTTONDOWN_y_last - LBUTTONUP_y_last) > 100) and (true) then
  begin
    show_btn(Point(LBUTTONUP_x_last, LBUTTONUP_y_last), '',true);
  end
  else
  begin
    if frm_btn <> nil then
      FreeAndNil(frm_btn);
  end;
end;

procedure TFrm_main.Timer_mouseTimer(Sender: TObject);
var
  i: Integer;
  txt: string;
  X, Y: Integer;
begin
  Timer_mouse.Enabled := false;

  if ((LBUTTONDOWN_x_last - LBUTTONUP_x_last) *
    (LBUTTONDOWN_x_last - LBUTTONUP_x_last) +
    (LBUTTONDOWN_y_last - LBUTTONUP_y_last) *
    (LBUTTONDOWN_y_last - LBUTTONUP_y_last) > 100) and (true) then
  begin

    txt := '';
    try
      old_clipboard_text := Clipboard.AsText;
      Clipboard.AsText := '';
      for i := 1 to 6 do
      begin
        do_copy();
        mysleep(200);
        txt := Clipboard.AsText;
        if txt <> '' then
          Break;
      end;
      Clipboard.AsText := old_clipboard_text;
    except

    end;

    show_btn(Point(LBUTTONUP_x_last, LBUTTONUP_y_last), trim(txt),false);
  end
  else
  begin
    if frm_btn <> nil then
      FreeAndNil(frm_btn);
  end;
end;

procedure TFrm_main.TrayIcon1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  if Button = mbLeft then
  begin
    PostMessage(Handle, WM_my_cmd, 1, 0);
  end;

end;

procedure TFrm_main.my_cmd(var Message: TMessage);
begin
  case Message.WParam of
    1:
      begin
        WindowState := wsNormal;
        Visible := true;
        BringWindowToTop(Handle);
        top := (Screen.Height - Height) div 2;
        left := (Screen.Width - Width) div 2;
      end;
    3:
      begin
        will_exit := true;
        OnClose := nil;
        OnCloseQuery := nil;
        WindowState := wsNormal;
        Visible := true;
        BringWindowToTop(Handle);
        PostMessage(Handle, WM_CLOSE, 0, 0);
      end;
  end;

end;

procedure TFrm_main.my_cmd_mouse(var Message: TMessage);
var
  X, Y: Integer;
begin
  try
    X := Message.LParam div 10000;
    Y := Message.LParam mod 10000;
    do_cmd_mouse(Message.WParam, X, Y);
  except
    on e: Exception do
    begin
      write_log('my_cmd_mouse ' + e.Message);
    end;
  end;
end;

end.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/871099.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IDEA安装和使用(配图)

功能强大&#xff1a; 1、强大的整合能力&#xff0c;比如Git,Maven,Spring等 2、开箱即用&#xff08;集成版本控制系统&#xff0c;多语言支持的框架随时可用&#xff09; 3、符合人体工程学 1、高度智能 2、提示功能的快速&#xff0c;便捷&#xff0c;范围广 3、好用…

Nginx平滑升级与回滚示例

Nginx 的平滑升级和平滑回滚是确保 Web 服务高可用性的重要组成部分。这两种操作允许你在不中断服务的情况下更新或回滚 Nginx 的版本。 Nginx 平滑升级与回滚 Nginx 的平滑升级和平滑回滚是确保 Web 服务高可用性的重要组成部分。这两种操作允许你在不中断服务的情况下更新或…

Vue 生命周期详解含demo、面试常问问题案例

Vue 生命周期详解、面试常问问题案例 含 demo 文章目录 Vue 生命周期详解、面试常问问题案例 含 demo一、Vue 生命周期是什么二、Vue 中如何使用生命周期钩子1. **beforeCreate**2. **created**3. **beforeMount**4. **mounted**5. **beforeUpdate**6. **updated**7. **beforeD…

AIoTedge边缘计算平台V1.0版本发布

AIoTedge边缘计算平台V1.0&#xff0c;一款创新的AIoT解决方案&#xff0c;现已正式发布。该产品集成了NodeRED软网关、边缘物联网平台和边缘AI能力&#xff0c;为企业提供强大的边云协同能力。它支持设备管理和泛协议接入&#xff0c;确保不同设备间的无缝连接。AIoTedgeV1.0还…

Hexo通过GitHub设置自定义域名

本身GitHub也是支持自定义域名的&#xff0c;本次教程将讲解如何使用GitHub自带的自定义域名解析。 1. GitHub设置 1.1 登录GitHub账号 登录GitHub账号&#xff0c;找到名称为 用户名.github.io的仓库&#xff0c;并点击进入。 1.2 进入Settings页面 点击如图的Settings按…

https://developer.nvidia.com/cuda-toolkit-archive

CUDA Toolkit Archive | NVIDIA Developerhttps://developer.nvidia.com/cuda-toolkit-archive

一款免费的文件锁定占用解除工具,绿色免安装版

IObit Unlocker是一款由IObit公司开发的免费文件解锁工具&#xff0c;旨在解决用户在删除、重命名、移动或复制文件和文件夹时遇到的“无法删除”或“访问被拒绝”的问题。该软件体积小巧&#xff0c;不到3MB&#xff0c;非常易于使用&#xff0c;并且不需要安装&#xff0c;可…

代码随想录 day 49 单调栈

第十章 单调栈part02 42. 接雨水 接雨水这道题目是 面试中特别高频的一道题&#xff0c;也是单调栈 应用的题目&#xff0c;大家好好做做。 建议是掌握 双指针 和单调栈&#xff0c;因为在面试中 写出单调栈可能 有点难度&#xff0c;但双指针思路更直接一些。 在时间紧张的情…

volta引发的血案

什么是volta volta用于做项目级别的node版本控制&#xff0c;当手头上的项目有多个时&#xff0c;且node版本可能还不一样&#xff0c;我们需要不断切换node版本。使用volta可以很好的解决这个问题。只需要安装volta&#xff0c;然后在下面的package.json中配置好node版本即可…

初始redis:List

列表 List 相当于数组或者顺序表。 对于List来说&#xff0c;两侧都可以插入和删除&#xff0c;时间复杂度是O(1)。 有很多的操作&#xff0c;比如 llen 可以获取List的长度&#xff0c;lrem 可以删除元素 &#xff0c;lrange可以去一个字符串 &#xff0c; lindex可以根据下标…

P38-数据存储1

百度2015年系统工程师笔试题 编程题 编程题 编程题 编程题

JUC- Synchronized原理

对象头概念 以 32 位虚拟机为例 Klass Word&#xff1a;指向类对象的指针&#xff0c;标明这个对象的类型 普通对象 |--------------------------------------------------------------| | Object Header (64 bits) | |---------------…

BI分析实操案例分享:零售企业如何利用BI工具对销售数据进行分析?

在当下这个竞争激烈的零售市场&#xff0c;企业如何在波诡云谲的商场中站稳脚跟&#xff0c;实现销售目标的翻倍增长&#xff1f; 答案可能就藏在那些看似杂乱无章的数字里。 是的&#xff0c;你没有看错&#xff0c;答案正是那些我们日常接触的销售数据。它们就像是宝藏&…

设计模式(单例模式、工厂模式、建造者模式、代理模式)

设计模式是前辈们对代码开发经验的总结&#xff0c;是解决特定问题的一系列套路。它不是语法规定&#xff0c;而是一套用来提高代码可复用性、可维护性、可读性、稳健性以及安全性的解决方案&#xff08;设计思想、设计经验&#xff09;。 一、六大原则 1、单一职责原则&#…

C语言--01基础数据类型

1.整型 概念&#xff1a;表达整数类型的数据语法&#xff1a; int a 123; // 定义了一个专门用来存储整数的变量a a 456 ; 需要注意的地方&#xff1a; int 的本意是 integer&#xff0c;即整数的意思int a 代表在内存中开辟一块小区域&#xff0c;称为 a&#xff0c;用来…

ado.net 操作sqlite

新建控制台项目 安装nuget包Microsoft.Data.Sqlite 数据库名字和链接 string dbName "test.db"; SqliteConnection? connection null; try {//创建链接connection new SqliteConnection($"Data Source{dbName}");//打开链接connection.Open(); } ca…

【Hot100】LeetCode—160. 相交链表

目录 1- 思路思路 2- 实现⭐160. 相交链表——题解思路 3- ACM 实现 原题连接&#xff1a;160. 相交链表 1- 思路 思路 首先想要找到相交点&#xff0c;需要定义连个指针。两个指针一定得是同步的&#xff0c;例如 A 链表 [1,2,3,4,5] &#xff0c;链表 B 是 [4,5] 1- 指针对…

大公报发表欧科云链署名文章:发行港元稳定币,建Web3.0新生态

欧科云链研究院资深研究员蒋照生近日与香港科技大学副校长兼香港Web3.0协会首席科学顾问汪扬、零壹智库创始人兼CEO柏亮&#xff0c;在大公报发布联合署名文章 ——《Web3.0洞察 / 发行港元稳定币&#xff0c;建Web3.0新生态》&#xff0c;引发市场广泛讨论。 文章就香港稳定币…

鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射

关于中断部分系列篇将用三篇详细说明整个过程. 中断概念篇 中断概念很多&#xff0c;比如中断控制器&#xff0c;中断源&#xff0c;中断向量&#xff0c;中断共享&#xff0c;中断处理程序等等.本篇做一次整理.先了解透概念才好理解中断过程.用海公公打比方说明白中断各个概念…

Spark SQL Catalyst工作流程

我们写的SQL语句&#xff0c;会经过一个优化器 (Catalyst)&#xff0c;转化为 RDD&#xff0c;交给集群执行。 而Catalyst在整个Spark 生态中的地位也是至关重要的。 SQL到RDD中间经过了一个Catalyst&#xff0c;它就是Spark SQL的核心&#xff0c;是针对Spark SQL语句执行过程…