delphi模板开发

发布时间 2023-10-09 11:26:29作者: delphi中间件

delphi模板开发

用模板开发,写代码就是填空题。

让开发变为填空题,这也是AI开发的指导思想。

1)制作模板

/// <author>cxg 2023-10-9</author>
unit db.crud;

interface

uses
  System.Classes, System.SysUtils, serialize, yn.log, db.unidacpool, db.unidac,
  global;

type
  TCRUD<T: record> = record
    dbid: string;
    func: string;
    sql: string;
    db: TDB;
    table: TTable<T>;
    req: TRequest;
    res: TResponse;
    type
      TTableModel = reference to procedure(db: TDB; tbl: TTable<T>; i: integer);
    procedure select(OnTableModel: TTableModel);  //查询
    procedure delete(OnTableModel: TTableModel);  //删除
    procedure insert(OnTableModel: TTableModel);  //新增
    procedure update(OnTableModel: TTableModel);  //修改
  end;

implementation

{ TCRUD<T> }

procedure TCRUD<T>.delete(OnTableModel: TTableModel);
begin
  if req.Body = nil then
    Exit;
  var pool: TDBPool := GetDBPool(dbid);
  db := pool.Lock;
  try
    try
      table := TSerial<TTable<T>>.unjson(TStream(req.Body));
      db.startTrans;
      for var i: Integer := 0 to High(table.rows) do
      begin
        db.qry.Close;
        db.qry.SQL.Clear;
        db.qry.sql.add(sql);
        OnTableModel(db, table, i);
        db.qry.ExecSQL;
      end;
      db.commitTrans;
      res.Send(success);
    except
      on E: Exception do
      begin
        db.rollbackTrans;
        res.Send(error(E.Message));
        WriteLog(func + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
  end;
end;

procedure TCRUD<T>.insert(OnTableModel: TTableModel);
begin
  if req.Body = nil then
    Exit;
  var pool: TDBPool := GetDBPool(dbid);
  db := pool.Lock;
  try
    try
      table := TSerial<TTable<T>>.unjson(TStream(req.Body));
      db.startTrans;
      for var i: Integer := 0 to High(table.rows) do
      begin
        db.qry.Close;
        db.qry.SQL.Clear;
        db.qry.sql.add(sql);
        OnTableModel(db, table, i);
        db.qry.ExecSQL;
      end;
      db.commitTrans;
      res.Send(success);
    except
      on E: Exception do
      begin
        db.rollbackTrans;
        res.Send(error(E.Message));
        WriteLog(func + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
  end;
end;

procedure TCRUD<T>.select(OnTableModel: TTableModel);
begin
  var pool: TDBPool := GetDBPool(dbid);
  db := pool.Lock;
  try
    try
      var where: string;
      if req.Body <> nil then
        where := TEncoding.UTF8.GetString(TBytesStream(req.Body).Bytes);
      var lsql: string;
      if where = '' then
        lsql := sql
      else
        lsql := sql + ' where ' + where;
      db.select(lsql);
      SetLength(table.rows, db.qry.RecordCount);
      var i: Integer := 0;
      db.qry.First;
      while not db.qry.Eof do
      begin
        OnTableModel(db, table, i);
        db.qry.Next;
        Inc(i);
      end;
      res.Send(TSerial<TTable<T>>.json(table));
    except
      on E: Exception do
      begin
        res.Send(error(E.Message));
        writelog(func + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
  end;
end;

procedure TCRUD<T>.update(OnTableModel: TTableModel);
begin
  if req.Body = nil then
    Exit;
  var pool: TDBPool := GetDBPool(dbid);
  db := pool.Lock;
  try
    try
      table := TSerial<TTable<T>>.unjson(TStream(req.Body));
      db.startTrans;
      for var i: Integer := 0 to High(table.rows) do
      begin
        db.qry.Close;
        db.qry.SQL.Clear;
        db.qry.sql.add(sql);
        OnTableModel(db, table, i);
        db.qry.ExecSQL;
      end;
      db.commitTrans;
      res.Send(success);
    except
      on E: Exception do
      begin
        db.rollbackTrans;
        res.Send(error(E.Message));
        WriteLog(func + E.Message);
      end;
    end;
  finally
    pool.Unlock(db);
  end;
end;

end.

  2)模板填空

unit danwei;
/// <author>cxg 2023-10-8</author>

interface

uses
  {product.model,} db.crud, yn.log, danwei.model, global, Net.CrossHttpServer,
  db.unidac, db.unidacpool, system.Classes, serialize, System.SysUtils;

type
  TRESTdanwei = class(TPersistent)  //单位的远程方法类
    procedure select(const req: TRequest; const res: TResponse);  //查询
    procedure insert(const req: TRequest; const res: TResponse);  //新增
    procedure update(const req: TRequest; const res: TResponse);  //修改
    procedure delete(const req: TRequest; const res: TResponse);  //删除
  end;

implementation

procedure TRESTdanwei.select(const req: TRequest; const res: TResponse);
//查询
begin
  var crud: TCRUD<Tdanwei>;
  crud.dbid := '1';
  crud.func := 'TRESTdanwei.select()';
  crud.sql := 'select * from tunit';
  crud.req := req;
  crud.res := res;
  crud.select(
    procedure(db: TDB; tbl: TTable<Tdanwei>; i: Integer)
    begin
      tbl.rows[i].unitid := db.qry.FieldByName('unitid').AsString;
      tbl.rows[i].unitname := db.qry.FieldByName('unitname').AsString;
    end);
end;

procedure TRESTdanwei.delete(const req: TRequest; const res: TResponse);
//删除
begin
  var crud: TCRUD<Tdanwei>;
  crud.dbid := '1';
  crud.func := 'TRESTdanwei.delete()';
  crud.sql := 'delete from tunit where unitid=:unitid';
  crud.req := req;
  crud.res := res;
  crud.delete(
    procedure(db: TDB; tbl: TTable<Tdanwei>; i: Integer)
    begin
      db.qry.ParamByName('unitid').AsString := tbl.rows[i].unitid;
    end);
end;

procedure TRESTdanwei.insert(const req: TRequest; const res: TResponse);
//新增
begin
  var crud: TCRUD<Tdanwei>;
  crud.dbid := '1';
  crud.func := 'TRESTdanwei.insert()';
  crud.sql := 'insert into tunit(unitid,unitname) values (:unitid,:unitname)';
  crud.req := req;
  crud.res := res;
  crud.insert(
    procedure(db: TDB; tbl: TTable<Tdanwei>; i: Integer)
    begin
      db.qry.ParamByName('unitid').AsString := tbl.rows[i].unitid;
      db.qry.ParamByName('unitname').AsString := tbl.rows[i].unitname;
    end);
end;

procedure TRESTdanwei.update(const req: TRequest; const res: TResponse);
//修改
begin
  var crud: TCRUD<Tdanwei>;
  crud.dbid := '1';
  crud.func := 'TRESTdanwei.update()';
  crud.sql := 'update tunit set unitid=:unitid,unitname=:unitname where unitid=:key';
  crud.req := req;
  crud.res := res;
  crud.update(
    procedure(db: TDB; tbl: TTable<Tdanwei>; i: Integer)
    begin
      db.qry.ParamByName('unitid').AsString := tbl.rows[i].unitid;
      db.qry.ParamByName('unitname').AsString := tbl.rows[i].unitname;
      db.qry.ParamByName('key').AsString := tbl.rows[i].unitid;
    end);
end;

initialization
  RegisterClass(TRESTdanwei);

finalization
  UnRegisterClass(TRESTdanwei);

end.