Browse Source

修改日志

GTong 1 year ago
parent
commit
746626037a

+ 2 - 0
.gitignore

@@ -0,0 +1,2 @@
+logs/
+file/

BIN
assets/SimHei.ttf


+ 64 - 9
file/test.txt

@@ -1,28 +1,83 @@
 [xugu]
 ip = 10.28.20.101
 port = 5190
-database = system
-user_password = sysdba:sysdba
+database = TESTDB
+user = sysdba
+password = SYSDBA
 
 [sql]
 用例名称 = 基础数据类型
 测试要求 = "基础数据类型应符合下列条款;支持数值类型;支持字符类型;支持二进制类型;支持日期类型;支持布尔类型;支持大文本类型支持大对象类型;"
+预置条件 = "数据库集群运行正常"
+测试程序 = "虚谷数据库管理系统(XGDBMS V11.0);虚谷数据库控制台工具(xgconsole V1)"
 测试步骤 = """
---支持数值类型;
+--支持数值类型
 create table  IF NOT EXISTS  t1(a int,b bigint,c float,d double,e tinyint,f smallint,g numeric(5,2));
 insert into t1 values(1,100,123456,123456,12,123,123.12);
 select * from t1;
+--删除表
+drop table if EXISTS   t1;
 --支持字符类型;
 create table  IF NOT EXISTS  t2(a char(20),b varchar,c clob);
 insert into t2 values('a','ab','abc');
 select * from t2;
+drop table if  EXISTS  t2;
+--支持日期类型;
+create table IF NOT EXISTS  t4(a date,b datetime,c datetime with time zone,d time,e time with time zone);
+insert into t4 values('2020-01-01','2021-01-01 10:10:10.111','2021-01-01 10:10:10.111 +8:00','10:10:10.111', '10:10:10.111 +8:00');
+select * from t4;
+--删除表
+drop table if  EXISTS  t4;
+--创建表,表列类型为布尔类型
+create table t5(a boolean);
+insert into t5 values('true')('false');
+select * from t5;
+--删除表
+drop table if  EXISTS  t5;
 """
 
-用例名称 = 12321数据类型
-测试要求 = "据类型大苏打萨达萨达是;支持数值类型;支持字符类型;支持二进制类型;支持日期类型;支持布尔类型;支持大文本类型支持大对象类型;"
+用例名称 = 扩展数据类型
+测试要求 = "完成扩展数据类型的要求;"
+预置条件 = "数据库安装部署完毕,使用xgconsole连接数据库成功,管理器工具连接数据库成功"
+测试程序 = "虚谷数据库控制台工具(xgconsole V1)"
 测试步骤 = """
---支持二进制类型;
-create table IF NOT EXISTS t4(a blob,b binary);
-insert into t4 values(?,'a'); <# /home/gtong/xugu_work/xgtest/file/test_pic_1.png
-select * from t4;
+    --删除测试表
+    DROP TABLE IF EXISTS INTERVAL_TABLE; 
+    --创建表,表列类型时间间隔
+   CREATE TABLE INTERVAL_TABLE(
+    A INTERVAL YEAR,
+    B INTERVAL MONTH,
+    C INTERVAL DAY,
+    D INTERVAL HOUR,
+    E INTERVAL MINUTE,
+    F INTERVAL SECOND,
+    G INTERVAL YEAR TO MONTH,
+    H INTERVAL DAY TO HOUR,
+    I INTERVAL DAY TO MINUTE,
+    J INTERVAL DAY TO SECOND,
+    K INTERVAL HOUR TO MINUTE,
+    L INTERVAL HOUR TO SECOND,
+    M INTERVAL MINUTE TO SECOND);
+    --插入数据
+    INSERT INTO INTERVAL_TABLE VALUES(
+    '1',
+    '2',
+    '3',
+    '4',
+    '5',
+    '6',
+    '12-1',
+    '10 1',
+    '10 11:01',
+    '10 10:10:01',
+    '10:10',
+    '10:10:10',
+    '10:10'); 
+    --查询表数据
+    SELECT * FROM INTERVAL_TABLE;
+    --删除表
+    drop table INTERVAL_TABLE;
 """
+
+
+

BIN
file/test_pic_1.png


+ 12 - 3
go.mod

@@ -3,7 +3,16 @@ module xgAutoTest
 go 1.21.4
 
 require (
-	github.com/go-xorm/xorm v0.7.9 // indirect
-	xorm.io/builder v0.3.6 // indirect
-	xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb // indirect
+	github.com/carmel/gooxml v0.0.0-20220216072414-40ff56130850
+	github.com/fogleman/gg v1.3.0
+	github.com/sirupsen/logrus v1.2.0
+	golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c
+)
+
+require (
+	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
+	github.com/konsorten/go-windows-terminal-sequences v1.0.1 // indirect
+	github.com/stretchr/testify v1.4.0 // indirect
+	golang.org/x/image v0.16.0 // indirect
+	golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a // indirect
 )

+ 16 - 121
go.sum

@@ -1,136 +1,31 @@
-cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
-github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
-github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
-github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
-github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
-github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
-github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
-github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
-github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
-github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/carmel/gooxml v0.0.0-20220216072414-40ff56130850 h1:5HOeLYzNkwXRWppRFonU+3ecOq+PjLvnwpAaTSdvsNs=
+github.com/carmel/gooxml v0.0.0-20220216072414-40ff56130850/go.mod h1:2u6ODG4PzDELX8qnX0wOGCdPJpWxnC5hBM7542SFrYc=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/denisenkom/go-mssqldb v0.0.0-20190707035753-2be1aa521ff4/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
-github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
-github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU=
-github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
-github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
-github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
-github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
-github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
-github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
-github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
-github.com/go-xorm/xorm v0.7.9 h1:LZze6n1UvRmM5gpL9/U9Gucwqo6aWlFVlfcHKH10qA0=
-github.com/go-xorm/xorm v0.7.9/go.mod h1:XiVxrMMIhFkwSkh96BW7PACl7UhLtx2iJIHMdmjh5sQ=
-github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
-github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
-github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
-github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
-github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
-github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
-github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
-github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
-github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
-github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
-github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
-github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
-github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
-github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
-github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
-github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
-github.com/jackc/pgx v3.6.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
-github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
-github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
-github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
+github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
 github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
-github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
-github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
-github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
-github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
-github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
-github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
-github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
-github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
-github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
-github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
-github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
-github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
-github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
-github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
-github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
-github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo=
 github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
-github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
-github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
-go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c h1:Vj5n4GlwjmQteupaxJ9+0FNOmBrHfq7vN4btdGoDZgI=
 golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
-golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
-golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
-golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
-golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
-golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
-golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
-golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/image v0.16.0 h1:9kloLAKhUufZhA12l5fwnx2NZW39/we1UhBesW433jw=
+golang.org/x/image v0.16.0/go.mod h1:ugSZItdV4nOxyqp56HmXwH0Ry0nBCpjnZdpDaIHdoPs=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
-golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
-golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
-google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
-google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
-google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
-google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
-google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
-google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
-google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
-gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
-gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
-gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
-gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
-honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
-xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
-xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb h1:msX3zG3BPl8Ti+LDzP33/9K7BzO/WqFXk610K1kYKfo=
-xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM=

+ 173 - 21
internal/auto/auto.go

@@ -4,71 +4,195 @@ import (
 	"bufio"
 	"database/sql"
 	"fmt"
+	"math/rand"
+	"os"
 	"strings"
+	"time"
 	"xgAutoTest/internal/config"
 	"xgAutoTest/internal/dbBase"
+	"xgAutoTest/internal/global"
+	"xgAutoTest/internal/produce"
 	"xgAutoTest/internal/utils"
 )
 
-func AutoRun() {
-	db := dbBase.GetDb()
-	//defer db.Close()
-	config := config.ConfigInfo{}
-	config.GetConfigInfo("./file/test.txt")
+// var textsList []string
+var imagesList [][]byte
+
+// var global.FileLocal string
+var tableUpperParts1 []produce.TableUpperPart
 
+func createLogFile() {
+	//	nowTime := time.Now()
+	//	global.FileLocal = fmt.Sprintf("./file/OK_%s/images", nowTime.Format("2006-01-02 15:04:05.00000"))
+	err := utils.CreateFolder(global.FileLocal)
+	if err != nil {
+		global.Logs.Error("创建结果images文件夹失败: ", err)
+	} else {
+		global.Logs.Printf("创建结果images文件夹成功: %s\n", global.FileLocal)
+	}
+	err = utils.CreateFolder(fmt.Sprintf(global.FileLocal + "/images/single"))
+	if err != nil {
+		global.Logs.Error("创建结果single文件夹失败: ", err)
+	} else {
+		global.Logs.Printf("创建结果single文件夹成功: %s\n", global.FileLocal)
+	}
+	err = utils.CreateFolder(fmt.Sprintf(global.FileLocal + "/images/merged"))
+	if err != nil {
+		global.Logs.Error("创建结果merged文件夹失败: ", err)
+	} else {
+		global.Logs.Printf("创建结果merged文件夹成功: %s\n", global.FileLocal)
+	}
+}
+
+func AutoRun(config config.ConfigInfo) {
+	//生成本次执行结果的文件夹
+	createLogFile()
+	//获取数据库连接
+	db := dbBase.GetDb()
+	//循环取出[sql]组下的片段,一个用例名称到下一个用列名称前为一个片段
 	for _, Part := range config.CommandSql.Part {
-		//fmt.Println("[sql] Part: ", Part)
-		//[].part 键值
+		var tableUpperPartTemp produce.TableUpperPart
+		tableUpperPartTemp.Left = make([]string, 0)
+		tableUpperPartTemp.Right = make([]string, 0)
+		tableUpperPartTemp.ImagesList = make([][]byte, 0)
+		tableUpperPartTemp.SqlToTextsList = make([]string, 0)
+		//文本
+		var texts string
+		//[].part 将片段转换为键值
 		partMap := config.ParseGroupCase(Part)
-		//fmt.Println("[sql] partMap: ", partMap)
+		//将片段添加到tableUpperPartTemp
+		tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "用例名称")
+		tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["用例名称"])
+		tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试要求")
+		tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试要求"])
+		tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试步骤")
+		tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试步骤"])
+		tableUpperPartTemp.Left = append(tableUpperPartTemp.Left, "测试程序")
+		tableUpperPartTemp.Right = append(tableUpperPartTemp.Right, partMap["测试程序"])
+
 		//[].partMap[测试步骤],sql运行
+		global.Logs.Printf("测试步骤: %s\n", partMap["测试步骤"])
 		partTestStepScanner := bufio.NewScanner(strings.NewReader(partMap["测试步骤"]))
+		var sql string
 		for partTestStepScanner.Scan() {
-			partLine := partTestStepScanner.Text()
-			switch {
+			partLine := strings.ToLower(strings.TrimSpace(partTestStepScanner.Text()))
+			fmt.Printf("partLine: %s\n", partLine)
 
+			switch {
+			//sql注释--
 			case strings.HasPrefix(partLine, "--"):
-				strings.TrimSpace(strings.TrimPrefix(partLine, "--"))
+				fmt.Println("带有--key")
+				sql = strings.TrimSpace(strings.TrimPrefix(partLine, "--"))
+				texts += sql
+				texts += "\n"
+				texts += "\n"
+				sql = ""
 				//fmt.Printf("带有--key: %s\n", key)
-
+			//sql语句
 			case strings.Contains(partLine, ";"):
+				fmt.Println("带有;key")
 				//fmt.Printf("不带有--sql: %s\n", partLine)
-				sql := strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
+				sql += strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
 				//fmt.Printf("sql TrimSpace: %s\n", sql)
-				isQueryOrInsert(db, sql)
-
+				texts += sql
+				texts += "\n"
+				isQueryOrInsert(db, sql, &tableUpperPartTemp)
+				sql = ""
+			default:
+				fmt.Println("继续读取key")
+				sql += strings.TrimSpace(partLine)
+				texts += sql
+				texts += "\n"
+				sql += "\n"
 			}
 		}
+
+		//将文本组添加到textsList
+		//textsList = append(textsList, texts)
+		tableUpperPartTemp.SqlToTextsList = append(tableUpperPartTemp.SqlToTextsList, texts)
+		tableUpperParts1 = append(tableUpperParts1, tableUpperPartTemp)
+		//检查[sql]下的片段读入是否错误
 		if err := partTestStepScanner.Err(); err != nil {
 			fmt.Println("partTestStepScanner.Error reading input:", err)
 		}
 
 	}
+
+	for i := range tableUpperParts1 {
+		fmt.Printf("tableUpperParts1内有 %v 条数据\n", i+1)
+
+	}
+	//生成word
+	generateWord(tableUpperParts1)
 }
 
-func isQueryOrInsert(db *sql.DB, sql string) {
+func executeSQL(partLine string, db *sql.DB, tableUpperPartTemp *produce.TableUpperPart) {
+	var texts string
+	switch {
+	//sql注释--
+	case strings.HasPrefix(partLine, "--"):
+		sql := strings.TrimSpace(strings.TrimPrefix(partLine, "--"))
+		texts += sql
+		texts += "\n"
+		texts += "\n"
+		//fmt.Printf("带有--key: %s\n", key)
+	//sql语句
+	case strings.Contains(partLine, ";"):
+		//fmt.Printf("不带有--sql: %s\n", partLine)
+		sql := strings.TrimSpace(partLine[:strings.Index(partLine, ";")+1])
+		//fmt.Printf("sql TrimSpace: %s\n", sql)
+		texts += sql
+		texts += "\n"
+		isQueryOrInsert(db, sql, tableUpperPartTemp)
+	}
+}
+
+func isQueryOrInsert(db *sql.DB, sql string, tableUpperPartTemp *produce.TableUpperPart) {
 	switch {
 	//执行查询语句
 	case strings.HasPrefix(sql, "select"):
 		{
-			fmt.Printf("\nsql is select: %s\n", sql)
-			dbBase.QueryString(db, sql)
+
+			ret := dbBase.QueryString(db, sql)
+
+			var im produce.ImageInfo
+			imageRet, err := im.Runimage2(ret)
+			if err != nil {
+				global.Logs.Error(err)
+				return
+			}
+			imagesList = append(imagesList, imageRet)
+			tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
+			now := time.Now()
+			im.SaveImage(fmt.Sprintf("%s/select %s_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[len(sql)-5:], now.Format("2006-01-02 15:04:05.00000")))
+
 		}
 	//执行大对象插入语句
 	case isBlob(sql):
 		{
-			fmt.Printf("\nsql is 大对象插入: %s\n", sql)
+			//fmt.Printf("\nsql is 大对象插入: %s\n", sql)
 		}
 	//其他语句调用exec函数
 	default:
 		{
 			//不是大对象插入语句的处理
-			fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql)
-			dbBase.ExecString(db, sql)
+			//fmt.Printf("\nsql is 不是大对象插入语句的处理: %s\n", sql)
+			ret := dbBase.ExecString(db, sql)
+			var im produce.ImageInfo
+			imageRet, err := im.Runimage2(ret)
+			if err != nil {
+				global.Logs.Error(err)
+				return
+			}
+			imagesList = append(imagesList, imageRet)
+			tableUpperPartTemp.ImagesList = append(tableUpperPartTemp.ImagesList, imageRet)
+			now := time.Now()
+			im.SaveImage(fmt.Sprintf("%s/(%s)_%s.png", fmt.Sprintf(global.FileLocal+"/images/single"), sql[:15], now.Format("2006-01-02 15:04:05.00000")))
 		}
 	}
 }
 
+// 是否是大对象语句
 func isBlob(sql string) bool {
 	utils.ContainsKeyword(sql, "values")
 	questionMarksCount := utils.IsInsertBlob(sql)
@@ -82,3 +206,31 @@ func isBlob(sql string) bool {
 	}
 
 }
+
+// 生成word
+func generateWord(tableUpperParts1 []produce.TableUpperPart) {
+	fmt.Println("调用generateWord()")
+	wd := produce.Newword()
+	for _, tableUpperPart := range tableUpperParts1 {
+
+		//fmt.Printf("text: %v\n", text)
+		mergedImage, err := produce.MergeImages(tableUpperPart.ImagesList)
+		if err != nil {
+			panic(err)
+		}
+		wd.WriterTable(global.FileLocal, "sad", tableUpperPart, mergedImage)
+
+		//保存图片
+		timeNow := time.Now().Format("2006-01-02 15:04:05.00000")
+		// 生成随机整数
+		randomInt := rand.Intn(100) // 生成0到99之间的随机整数
+		err = os.WriteFile(fmt.Sprintf("%s/merged_image_%s_%d.png", fmt.Sprintf(global.FileLocal+"/images/merged"), timeNow, randomInt), mergedImage, 0644)
+		if err != nil {
+			panic(err)
+		}
+		fmt.Println("生成合成图片-------------")
+		//imagesList = nil
+	}
+	//保存word为文件
+	wd.SaveWord(global.FileLocal)
+}

+ 135 - 0
internal/config/config_test.go

@@ -1,10 +1,16 @@
 package config
 
 import (
+	"bufio"
 	"fmt"
+	"io"
+	"os"
 	"path"
 	"runtime"
+	"strings"
 	"testing"
+
+	"golang.org/x/crypto/ssh"
 )
 
 func getCurrentPath() string {
@@ -46,3 +52,132 @@ func TestReadFile(t1 *testing.T) {
 		fmt.Println("ParseSqlCase:", b)
 	}
 }
+
+var str = ` --删除测试表
+DROP TABLE IF EXISTS INTERVAL_TABLE; 
+--创建表,表列类型时间间隔
+!!! 
+CREATE TABLE INTERVAL_TABLE(
+A INTERVAL YEAR,
+B INTERVAL MONTH,
+C INTERVAL DAY,
+D INTERVAL HOUR,
+E INTERVAL MINUTE,
+F INTERVAL SECOND,
+G INTERVAL YEAR TO MONTH,
+H INTERVAL DAY TO HOUR,
+I INTERVAL DAY TO MINUTE,
+J INTERVAL DAY TO SECOND,
+K INTERVAL HOUR TO MINUTE,
+L INTERVAL HOUR TO SECOND,
+M INTERVAL MINUTE TO SECOND);
+   !!!
+--插入数据
+   !!! 
+INSERT INTO INTERVAL_TABLE VALUES(
+'1',
+'2',
+'3',
+'4',
+'5',
+'6',
+'12-1',
+'10 1',
+'10 11:01',
+'10 10:10:01',
+'10:10',
+'10:10:10',
+'10:10');
+!!! 
+--查询表数据
+SELECT * FROM INTERVAL_TABLE;
+--删除表
+drop table INTERVAL_TABLE;`
+
+func TestAnalysisFile(t1 *testing.T) {
+	var tests string
+	var sql string
+	partTestStepScanner := bufio.NewScanner(strings.NewReader(str))
+	for partTestStepScanner.Scan() {
+		partLine := partTestStepScanner.Text()
+		partLine = strings.TrimSpace(partLine)
+		if strings.HasPrefix(partLine, "--") {
+			fmt.Println("检测到--", partLine)
+			continue
+		}
+		if strings.HasPrefix(partLine, "!!!") {
+			fmt.Println("检测到!!!", partLine)
+			for partTestStepScanner.Scan() {
+				partLine := partTestStepScanner.Text()
+				sql += partLine
+				fmt.Println("partLine2:", partLine)
+			}
+			continue
+		}
+		fmt.Println("sql:", sql)
+		tests = partLine
+		fmt.Println("tests:", tests)
+	}
+	//fmt.Println("tests", tests)
+
+}
+
+func TestName(t *testing.T) {
+	// 远程SSH服务器地址和端口
+	sshAddr := "10.28.20.101:22"
+	// SSH登录用户名
+	sshUser := "root"
+	// SSH登录密码或密钥
+
+	// 配置SSH客户端
+	config := &ssh.ClientConfig{
+		User: sshUser,
+		Auth: []ssh.AuthMethod{
+			ssh.Password("Xugu@2023"),
+		},
+		HostKeyCallback: ssh.InsecureIgnoreHostKey(),
+	}
+
+	// 连接到远程主机
+	conn, err := ssh.Dial("tcp", sshAddr, config)
+	if err != nil {
+		panic(err)
+	}
+	defer conn.Close()
+
+	// 创建SSH会话
+	session, err := conn.NewSession()
+	if err != nil {
+		panic(err)
+	}
+	defer session.Close()
+
+	// 执行远程命令
+
+	// 创建输出管道
+	stdout, err := session.StdoutPipe()
+	if err != nil {
+		panic(err)
+	}
+
+	// 启动远程命令
+	_ = session.Start("pwd")
+	if err != nil {
+		panic(err)
+	}
+
+	// 从输出管道读取命令输出
+	go func() {
+		_, err := io.Copy(os.Stdout, stdout)
+		if err != nil {
+			panic(err)
+		}
+	}()
+
+	// 等待命令执行完成
+	err = session.Wait()
+	if err != nil {
+		panic(err)
+
+	}
+}

+ 4 - 4
internal/config/readFile.go

@@ -2,9 +2,9 @@ package config
 
 import (
 	"bufio"
-	"fmt"
 	"os"
 	"strings"
+	"xgAutoTest/internal/global"
 )
 
 type ConfigInfo struct {
@@ -48,7 +48,7 @@ func (config *ConfigInfo) ReadCofing(fileName string) map[string]string {
 	// 打开配置文件
 	file, err := os.Open(fileName)
 	if err != nil {
-		fmt.Println("打开文件错误:", err)
+		global.Logs.Error("打开文件错误:", err)
 		return nil
 	}
 	defer file.Close()
@@ -88,7 +88,7 @@ func (config *ConfigInfo) ParseConfigFile(file *os.File) map[string]string {
 	}
 
 	if err := scanner.Err(); err != nil {
-		fmt.Println("Error scanning file:", err)
+		global.Logs.Error("Error scanning file:", err)
 		return nil
 	}
 	return result
@@ -129,7 +129,7 @@ func (*ConfigInfo) ParseGroupCase(input string) map[string]string {
 		}
 	}
 	if err := scanner.Err(); err != nil {
-		fmt.Println("Error reading input:", err)
+		global.Logs.Error("Error reading input:", err)
 		os.Exit(1)
 	}
 	return sqlMap

+ 15 - 8
internal/dbBase/db.go

@@ -7,7 +7,6 @@ import (
 	"log"
 	"os"
 	"strings"
-	"xgAutoTest/internal/logs"
 	_ "xgAutoTest/pkg/go-driver-xugusql"
 )
 import "time"
@@ -34,8 +33,7 @@ func GetDb() *sql.DB {
 }
 
 func QueryString(db *sql.DB, sql string) string {
-	//fmt.Printf("\nQueryString().sql: \n", sql)
-	logs.Log.Printf("QueryString().sql: %s\n", sql)
+	fmt.Println("执行查询sql: ", sql)
 	// 记录开始时间
 	start := time.Now()
 	rows, err := db.Query(sql)
@@ -87,21 +85,26 @@ func QueryString(db *sql.DB, sql string) string {
 
 	// 计算操作耗时
 	duration := end.Sub(start)
+	durationInt := int64(duration.Milliseconds())
+	if durationInt == 0 {
+		durationInt = 1
+	}
 	rows.Close()
 
 	sqlResult += fmt.Sprintf("\nTotal %d records.\n", records)
 
-	sqlResult += fmt.Sprintf("\nUse time:%s ms.", strings.Replace(duration.String(), "µs", "", -1))
-	fmt.Println("sqlResult:", sqlResult)
+	sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
+	//fmt.Println("sqlResult:", sqlResult)
 	return sqlResult
 }
 
 func ExecString(db *sql.DB, sql string) string {
+	fmt.Println("执行插入sql: ", sql)
 	var sqlResult string
 	start := time.Now()
 	result, err := db.Exec(sql)
 	if err != nil {
-		log.Fatal(err)
+		log.Fatal("Exe查询错误", err)
 	}
 	// 记录结束时间
 	end := time.Now()
@@ -116,9 +119,13 @@ func ExecString(db *sql.DB, sql string) string {
 	}
 	//fmt.Printf("Rows affected: %d\n", rowsAffected)
 
+	durationInt := int64(duration.Milliseconds())
+	if durationInt == 0 {
+		durationInt = 1
+	}
 	sqlResult += fmt.Sprintf("Total %d records effected.", rowsAffected)
-	sqlResult += fmt.Sprintf("\nUse time:%s ms.", strings.Replace(duration.String(), "µs", "", -1))
-	fmt.Println("sqlResult", sqlResult)
+	sqlResult += fmt.Sprintf("\nUse time:%d ms.", durationInt)
+	//fmt.Println("sqlResult", sqlResult)
 
 	return sqlResult
 }

+ 16 - 0
internal/dbBase/db_test.go

@@ -1,12 +1,28 @@
 package dbBase
 
 import (
+	"database/sql"
 	"fmt"
 	"log"
 	"os"
 	"testing"
 )
 
+func TestDbLink2(t1 *testing.T) {
+
+	db, err := sql.Open("xugusql", "IP=10.28.20.101;DB=SYSTEM;User=SYSDBA;"+"PWD=SYSDBA;Port=5190;AUTO_COMMIT=on;CHAR_SET=UTF8")
+
+	err = db.Ping()
+	if err != nil {
+		fmt.Printf("connect xugu dbms ... failed\n")
+	} else {
+
+		fmt.Printf("connect xugu dbms ... ok\n")
+	}
+
+	err = db.Close()
+
+}
 func TestDbLink(t1 *testing.T) {
 
 	InitDb("10.28.20.101", "5190", "TESTDB", "SYSDBA", "SYSDBA")

+ 24 - 0
internal/global/global.go

@@ -0,0 +1,24 @@
+package global
+
+import (
+	"fmt"
+	"time"
+	"xgAutoTest/internal/logger"
+	"xgAutoTest/internal/utils"
+
+	"github.com/sirupsen/logrus"
+)
+
+var Logs *logrus.Logger
+var FileLocal string
+
+func Init() {
+	nowTime := time.Now()
+
+	FileLocal = fmt.Sprintf("./file/OK_%s", nowTime.Format("2006-01-02 15:04:05.00000"))
+	err := utils.CreateFolder(fmt.Sprintf("%s/logs", FileLocal))
+	if err != nil {
+		fmt.Println("创建logs文件夹出错:", err)
+	}
+	Logs = logger.Init(fmt.Sprintf("%s/logs/logs_%s", FileLocal, nowTime.Format("2006-01-02 15:04:05.00")), "info")
+}

+ 76 - 0
internal/logger/logs.go

@@ -0,0 +1,76 @@
+package logger
+
+import (
+	"io"
+	"log"
+	"os"
+
+	"github.com/sirupsen/logrus"
+)
+
+type Hook struct {
+	Writer    io.Writer
+	Formatter logrus.Formatter
+	Level     []logrus.Level
+}
+
+func (h *Hook) Fire(entry *logrus.Entry) error {
+	line, err := h.Formatter.Format(entry)
+	if err != nil {
+		return err
+	}
+	h.Writer.Write(line)
+	return nil
+}
+
+func (h *Hook) Levels() []logrus.Level {
+	return h.Level
+}
+
+func newHook(writer io.Writer, formatter logrus.Formatter, level logrus.Level) *Hook {
+	var levels []logrus.Level
+	for _, l := range logrus.AllLevels {
+		if l <= level {
+			levels = append(levels, l)
+		}
+	}
+	return &Hook{
+		Writer:    writer,
+		Formatter: formatter,
+		Level:     levels,
+	}
+}
+
+func Init(logFilePath string, logLevelStr string) *logrus.Logger {
+	var Logger *logrus.Logger
+	logLevel, err := logrus.ParseLevel(logLevelStr)
+	if err != nil {
+		logLevel = logrus.InfoLevel
+		log.Printf("Invalid log level: %s. Defaulting to info", logLevelStr)
+	}
+
+	Logger = logrus.New()
+	Logger.SetOutput(io.Discard)
+
+	logFile, err := os.OpenFile(logFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
+	if err != nil {
+		log.Printf("Failed to open log file: %s", logFilePath)
+		panic(err)
+	}
+
+	Logger.AddHook(newHook(
+		logFile,
+		&logrus.JSONFormatter{},
+		logLevel,
+	))
+
+	Logger.AddHook(newHook(
+		os.Stderr,
+		&logrus.TextFormatter{
+			FullTimestamp: true,
+			ForceColors:   true,
+		},
+		logLevel,
+	))
+	return Logger
+}

+ 0 - 89
internal/logs/logs.go

@@ -1,89 +0,0 @@
-package logs
-
-import (
-	"bytes"
-	"fmt"
-	"io"
-	"os"
-	"path"
-	"time"
-
-	"github.com/sirupsen/logrus"
-)
-
-var Log *logrus.Logger
-
-const (
-	red    = 31
-	yellow = 33
-	blue   = 36
-	gray   = 37
-)
-
-type LogFormatter struct {
-}
-
-func (t LogFormatter) Format(entry *logrus.Entry) ([]byte, error) {
-
-	//根据不同的level展示颜色
-	var levelColor int
-	switch entry.Level {
-	case logrus.DebugLevel, logrus.TraceLevel:
-		levelColor = gray
-	case logrus.WarnLevel:
-		levelColor = yellow
-	case logrus.ErrorLevel, logrus.FatalLevel, logrus.PanicLevel:
-		levelColor = red
-	default:
-		levelColor = blue
-	}
-
-	//字节缓冲区
-	var b *bytes.Buffer
-	if entry.Buffer != nil {
-		b = entry.Buffer
-	} else {
-		b = &bytes.Buffer{}
-	}
-	//自定义日期格式
-	timestamp := entry.Time.Format("2006-01-02 15:04:06")
-	if entry.HasCaller() {
-		//自定义文件路径
-		//fmt.Println("自定义文件路径")
-		funcVal := entry.Caller.Function
-		fileVal := fmt.Sprintf("%s:%d", path.Base(entry.Caller.File), entry.Caller.Line)
-		//自定义输出格式
-		fmt.Fprintf(b, "[%s] \033[%dm[%s]\033[0m %s %s %s \n", timestamp, levelColor, entry.Level, fileVal, funcVal, entry.Message)
-	} else {
-		fmt.Println(" else else自定义文件路径")
-		fmt.Fprintf(b, "[%s] \033[%dm[%s]\033[0m %s  %s %s  \n", timestamp, levelColor, entry.Level, entry.Message)
-	}
-
-	return b.Bytes(), nil
-}
-func InitLogger() *logrus.Logger {
-	// 定义logs文件夹的路径
-	logsDir := "./logs"
-
-	// 尝试获取logs文件夹的信息
-	_, err := os.Stat(logsDir)
-	if os.IsNotExist(err) {
-		// 如果文件夹不存在,则创建它
-		err = os.MkdirAll(logsDir, 0755)
-		if err != nil {
-			// 处理创建文件夹时可能遇到的错误
-			fmt.Println("创建文件夹时出错:", err)
-		}
-	}
-
-	mLog := logrus.New() //新建一个实例
-	currentTime := time.Now().Format("2006-01-02 15.04.06")
-	logName := "./logs/xuguALL_" + currentTime + "txt"
-	file, _ := os.OpenFile(logName, os.O_CREATE|os.O_RDWR|os.O_APPEND, 0755)
-	mLog.SetOutput(io.MultiWriter(os.Stdout, file)) //设置输出类型
-	mLog.SetReportCaller(true)                      //开启返回函数名和行号
-	//mLog.SetFormatter(&logrus.JSONFormatter{})//设置自定义的Formatter
-	mLog.SetFormatter(&LogFormatter{}) //设置自定义的Formatter
-	mLog.SetLevel(logrus.DebugLevel)   //设置最低等级
-	return mLog
-}

BIN
internal/produce/abcd.png


+ 181 - 19
internal/produce/image.go

@@ -3,41 +3,49 @@ package produce
 import (
 	"bytes"
 	"fmt"
+	"image"
+	"image/color"
+	"image/draw"
 	"image/png"
 	"os"
+	"strings"
+	"time"
 
 	"github.com/fogleman/gg"
 )
 
-type imageInfo struct {
+type ImageInfo struct {
 	dc *gg.Context
 }
 
-func (*imageInfo) Runimage(s string) ([]byte, error) {
+func (im *ImageInfo) Runimage(sql string) ([]byte, error) {
 	// 创建一个新的gg.Context实例,根据字符串长度动态设置图像大小
 	const padding = 20    // 上下留白
 	const charWidth = 10  // 字符宽度
 	const lineHeight = 15 // 行高
-	const maxWidth = 800  // 最大宽度
+	const maxWidth = 2500 // 最大宽度
 
 	// 计算图像高度和行数
 	lines := 0
 	width := 0.0
 	height := padding * 2
 	lineWidth := 0.0
-	dc := gg.NewContext(1, 1)
+	im.dc = gg.NewContext(1, 1)
 	//加载字体和字体大小
-	if err := dc.LoadFontFace("../assets/SimHei.ttf", 12); err != nil {
+	if err := im.dc.LoadFontFace("/home/gtong/xugu_work/xg_autotest/assets/SimHei.ttf", 12); err != nil {
 		fmt.Println(err.Error())
 		return nil, nil
 	}
+
 	//计算图像高度和行数
-	for _, r := range s {
-		w, _ := dc.MeasureString(string(r))
+	for _, r := range sql {
+		w, _ := im.dc.MeasureString(string(r))
 		if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) {
+			fmt.Printf("\r == 'n': \n")
 			lines++
 			if lineWidth > width {
 				width = lineWidth
+				fmt.Printf("\nwidth: %f\n", width)
 			}
 			lineWidth = 0.0
 		}
@@ -46,21 +54,24 @@ func (*imageInfo) Runimage(s string) ([]byte, error) {
 
 	lines++
 	if lineWidth > width {
+
+		//width = lineWidth + (lineWidth * 0.2)
 		width = lineWidth
+		fmt.Printf("lineWidth > width : %f", width)
 	}
 	height += (lines) * lineHeight
 
-	dc = gg.NewContext(int(width+float64(padding*2)), int(height))
-	dc.SetRGB(0, 0, 0)
-	dc.Clear()
-	dc.SetRGB(1, 1, 1)
+	im.dc = gg.NewContext(int(width+float64(padding*2)), int(height))
+	im.dc.SetRGB(0, 0, 0)
+	im.dc.Clear()
+	im.dc.SetRGB(1, 1, 1)
 
 	// 绘制字符串
 	x := padding
 	y := padding
 	lineWidth = 0.0
-	for _, r := range s {
-		w, _ := dc.MeasureString(string(r))
+	for _, r := range sql {
+		w, _ := im.dc.MeasureString(string(r))
 		if r == '\n' || lineWidth+w > float64(maxWidth-padding*2) {
 			y += lineHeight
 			lineWidth = 0.0
@@ -68,23 +79,101 @@ func (*imageInfo) Runimage(s string) ([]byte, error) {
 				continue
 			}
 		}
-		dc.DrawString(string(r), float64(x)+lineWidth, float64(y))
+		im.dc.DrawString(string(r), float64(x)+lineWidth, float64(y))
 		lineWidth += w
 	}
 
 	// 将图像编码为PNG格式的二进制数据
 	var buf bytes.Buffer
-	if err := png.Encode(&buf, dc.Image()); err != nil {
+	if err := png.Encode(&buf, im.dc.Image()); err != nil {
+		return nil, nil
+	}
+	name := "/home/gtong/xugu_work/xg_autotest/file/test_pic_1.png"
+	newfile, err := os.Create(name)
+	if err != nil {
+		fmt.Println(err.Error())
+
+	}
+	defer newfile.Close()
+	err = png.Encode(newfile, im.dc.Image())
+	if err != nil {
+		fmt.Println(err.Error())
+
+	}
+
+	return buf.Bytes(), nil
+}
+
+func (im *ImageInfo) Runimage2(sql string) ([]byte, error) {
+	// 设置图片大小
+	width := 100
+	height := 100
+
+	// 设置字体和字体大小
+	fontSize := 20.0
+	fontPath := "/home/gtong/xugu_work/xg_autotest/assets/SimHei.ttf"
+
+	// 根据字符串长度调整图片宽度和高度
+	dcTemp := gg.NewContext(100, 100)
+	// 加载字体和字体大小
+	if err := dcTemp.LoadFontFace(fontPath, 10); err != nil {
+		fmt.Println(err.Error())
+		return nil, nil
+	}
+	SqlLines := strings.Split(sql, "\n")
+	// for _, v := range SqlLines {
+	// 	fmt.Println("sql := ", v)
+	// }
+	//计算有多少行
+	lineHeight := 0
+	for _, line := range SqlLines {
+		textWidth, _ := dcTemp.MeasureString(line)
+		if int(textWidth) > width {
+			width = int(textWidth)
+		}
+		lineHeight++
+	}
+
+	//设置高度
+	height += lineHeight * int(fontSize*1.2)
+	// 创建一个新的绘图上下文
+	width = int(width) * 4 // 保留一些空白边距
+
+	im.dc = gg.NewContext(width, height)
+	// 加载字体和字体大小
+	if err := im.dc.LoadFontFace(fontPath, fontSize); err != nil {
+		fmt.Println(err.Error())
+		return nil, nil
+	}
+	im.dc.SetColor(color.Black)
+	im.dc.Clear()
+	// 设置文本颜色为白色
+	im.dc.SetColor(color.White)
+
+	// 在图片顶部离开 20px,左边开始绘制文本
+	lines := strings.Split(sql, "\n")
+
+	x := 2.0  // 离左边 20px
+	y := 20.0 // 离顶部 20px
+	for _, line := range lines {
+		im.dc.DrawString(line, x, y)
+		y += fontSize * 1.2 // 增加行间距
+	}
+
+	//返回图片的二进制数据
+	var buf bytes.Buffer
+	if err := png.Encode(&buf, im.dc.Image()); err != nil {
 		return nil, nil
 	}
-	//SaveImage(dc, "")
 	return buf.Bytes(), nil
 }
 
-func (im *imageInfo) SaveImage(fileName string) {
+func (im *ImageInfo) SaveImage(fileName string) {
+
 	// 保存图片
-	name := "../file/test_pic_1.png"
-	newfile, err := os.Create(name)
+
+	newfile, err := os.Create(fmt.Sprintf("%s", fileName))
+
 	if err != nil {
 		fmt.Println(err.Error())
 		return
@@ -99,3 +188,76 @@ func (im *imageInfo) SaveImage(fileName string) {
 		return
 	}
 }
+
+// 检查file文件夹是否存在,不存在则创建
+func CreateFolder() string {
+	dirName := "./file"
+	// 检查文件夹是否存在
+	if _, err := os.Stat(dirName); os.IsNotExist(err) {
+		// 文件夹不存在,创建文件夹
+		err := os.Mkdir(dirName, 0755)
+		if err != nil {
+			fmt.Println("创建文件夹失败:", err)
+			return ""
+		}
+		fmt.Println("文件夹创建成功")
+	} else if err != nil {
+		// 其他错误,打印错误信息
+		fmt.Println("检查文件夹失败:", err)
+		return ""
+	} else {
+		// 文件夹已经存在
+		fmt.Println("文件夹已经存在")
+	}
+	dirName = fmt.Sprintf("%s/%s", dirName, time.Now())
+	err := os.Mkdir(dirName, 0755)
+	if err != nil {
+		fmt.Println("创建文件夹失败:", err)
+		return ""
+	}
+	return dirName
+}
+
+// 合并图片为一张
+func MergeImages(imageBytes [][]byte) ([]byte, error) {
+	var maxWidth int
+	var totalHeight int
+
+	// 计算合并后图片的宽度和高度
+	for _, imgData := range imageBytes {
+		img, _, err := image.Decode(bytes.NewReader(imgData))
+		if err != nil {
+			return nil, err
+		}
+		bounds := img.Bounds()
+		if bounds.Dx() > maxWidth {
+			maxWidth = bounds.Dx()
+		}
+		totalHeight += bounds.Dy()
+	}
+
+	// 创建一个黑色背景的图片
+	dst := image.NewRGBA(image.Rect(0, 0, maxWidth, totalHeight))
+	draw.Draw(dst, dst.Bounds(), &image.Uniform{color.Black}, image.Point{}, draw.Src)
+
+	// 合并图片
+	var offsetY int
+	for _, imgData := range imageBytes {
+		img, _, err := image.Decode(bytes.NewReader(imgData))
+		if err != nil {
+			return nil, err
+		}
+		bounds := img.Bounds()
+		draw.Draw(dst, image.Rect(0, offsetY, bounds.Dx(), offsetY+bounds.Dy()), img, image.Point{}, draw.Src)
+		offsetY += bounds.Dy()
+	}
+
+	// 保存合并后的图片到字节数组
+	var buf bytes.Buffer
+	err := png.Encode(&buf, dst)
+	if err != nil {
+		return nil, err
+	}
+
+	return buf.Bytes(), nil
+}

+ 42 - 0
internal/produce/image_test.go

@@ -0,0 +1,42 @@
+package produce
+
+import (
+	"fmt"
+	"testing"
+	"xgAutoTest/internal/dbBase"
+)
+
+func TestRun(t1 *testing.T) {
+	//	global.Logs = logger.InitLogger()
+	var im ImageInfo
+	sqlResult := "insert into t4 values('2020-01-01','2021-01-01 10:10:10.111','2021-01-01 10:10:10.111 +8:00','10:10:10.111', '10:10:10.111 +8:00');"
+	sqlResult += fmt.Sprintf("\nTotal 123 records.\n")
+
+	sqlResult += fmt.Sprintf("\nUse time:3123 ms.")
+	fmt.Println("sqlResult:", sqlResult)
+	im.Runimage(sqlResult)
+	im.SaveImage("./abcd.png")
+
+}
+func TestRunimage2(t1 *testing.T) {
+	//global.Logs = logger.InitLogger()
+	var im ImageInfo
+	sqlResult := "create table  IF NOT EXISTS  t1(a int,b bigint,c float,d double,e tinyint,f smallint,g numeric(5,2))"
+	sqlResult += fmt.Sprintf("\nTotal 123 records.\n")
+
+	sqlResult += fmt.Sprintf("\nUse time:3123 ms.")
+	fmt.Println("sqlResult:", sqlResult)
+	im.Runimage2(sqlResult)
+	im.SaveImage("./abcd.png")
+}
+func TestRunimageToDb(t1 *testing.T) {
+	//global.Logs = logs.InitLogger()
+	dbBase.InitDb("10.28.20.101", "5190", "TESTDB", "SYSDBA", "SYSDBA")
+	db := dbBase.GetDb()
+	sqlResult := dbBase.QueryString(db, "select * from t4;")
+	var im ImageInfo
+
+	fmt.Println("sqlResult:", sqlResult)
+	im.Runimage2(sqlResult)
+	im.SaveImage("./abcd.png")
+}

BIN
internal/produce/output.png


+ 179 - 0
internal/produce/word.go

@@ -0,0 +1,179 @@
+package produce
+
+import (
+	"fmt"
+	"log"
+	"time"
+
+	"xgAutoTest/internal/global"
+
+	"github.com/carmel/gooxml/color"
+	"github.com/carmel/gooxml/common"
+	"github.com/carmel/gooxml/document"
+	"github.com/carmel/gooxml/measurement"
+	"github.com/carmel/gooxml/schema/soo/wml"
+)
+
+type TableUpperPart struct {
+	Left           []string
+	Right          []string
+	SqlToTextsList []string
+	ImagesList     [][]byte
+}
+type WordInfo struct {
+	doc *document.Document
+}
+
+func ToWord() {
+	//1. 创建文档并填写内容
+	doc := document.New()
+	para := doc.AddParagraph() // 新增段落
+	run := para.AddRun()
+	run.AddText("这里是段落文字信息") // 添加文字信息
+	// 如果想对添加的文字信息进行换行处理,使用'\r'
+	run.AddText("这里第一行段落文字信息\r这里是第二行段落文字信息")
+
+	// 2. 给段落添加各种样式
+	para.SetStyle("Title")
+	para.SetStyle("Heading1")                                    // Heading1 Heading2 Heading3
+	para.Properties().SetFirstLineIndent(0.5 * measurement.Inch) // 段落添加首行缩进
+	para.Properties().AddSection(wml.ST_SectionMarkNextPage)     // 另起一页(用在AddText之后)
+
+	// 3. 给文字添加各种样式
+	run.Properties().SetBold(true)                                       // 是否加粗
+	run.Properties().SetFontFamily("Courier")                            // 字体
+	run.Properties().SetSize(15)                                         // 字号
+	run.Properties().SetColor(color.Red)                                 // 文字颜色
+	run.Properties().SetKerning(5)                                       // 文字字距
+	run.Properties().SetCharacterSpacing(5)                              // 字符间距调整
+	run.Properties().SetHighlight(wml.ST_HighlightColorYellow)           // 设置高亮
+	run.Properties().SetUnderline(wml.ST_UnderlineWavyDouble, color.Red) // 下划线
+
+	// 4. 设置页眉页脚
+	hdr := doc.AddHeader()
+	para = hdr.AddParagraph()
+	para.Properties().AddTabStop(2.5*measurement.Inch, wml.ST_TabJcCenter, wml.ST_TabTlcNone)
+	run = para.AddRun()
+	run.AddTab()
+	run.AddText("My Document Title")
+
+	ftr := doc.AddFooter()
+	para = ftr.AddParagraph()
+	para.Properties().AddTabStop(6*measurement.Inch, wml.ST_TabJcRight, wml.ST_TabTlcNone)
+	run = para.AddRun()
+	run.AddText("Some subtitle goes here")
+	run.AddTab()
+
+	//  5. 添加图片
+	//
+	// 初始化图片信息
+	img1, err := common.ImageFromFile("./test_pic_1.png")
+	if err != nil {
+		log.Fatalf("unable to create image: %s", err)
+	}
+	img1ref, err := doc.AddImage(img1)
+	if err != nil {
+		log.Fatalf("unable to add image to document: %s", err)
+	}
+	// 将图片添加到对应的段落
+	para = doc.AddParagraph()
+	anchored, err := para.AddRun().AddDrawingAnchored(img1ref)
+	if err != nil {
+		log.Fatalf("unable to add anchored image: %s", err)
+	}
+	// 设置图片相关样式
+	anchored.SetName("图片名称")
+	anchored.SetSize(2*measurement.Inch, 2*measurement.Inch)
+	anchored.SetOrigin(wml.WdST_RelFromHPage, wml.WdST_RelFromVTopMargin)
+	anchored.SetHAlignment(wml.WdST_AlignHCenter)
+	anchored.SetYOffset(3 * measurement.Inch)
+	anchored.SetTextWrapSquare(wml.WdST_WrapTextBothSides)
+	doc.SaveToFile("simple.docx") // 保存文件路径,此处应为绝对路径
+}
+
+func Newword() *WordInfo {
+	return &WordInfo{
+		doc: document.New(),
+	}
+}
+func (wd *WordInfo) WriterTable(fileLocal string, tableName string, tableUpperPart TableUpperPart, SingleImage []byte) {
+	//wd.doc = document.New()
+	// 写入表名
+	wd.doc.AddParagraph().AddRun().AddText(tableName)
+
+	// 添加一个表格
+	table := wd.doc.AddTable()
+	// width of the page
+	table.Properties().SetWidthAuto()
+	// with thick borers
+	borders := table.Properties().Borders()
+	borders.SetAll(wml.ST_BorderSingle, color.Auto, measurement.Zero)
+
+	for i, left := range tableUpperPart.Left {
+		addRow(&table, left, tableUpperPart.Right[i])
+	}
+
+	wd.InsertSingleImage(&table, SingleImage)
+
+	wd.doc.AddParagraph()
+
+}
+
+func (wd *WordInfo) SaveWord(fileLocal string) {
+	timeNow := time.Now().Format("2006-01-02-15.04.05")
+	wd.doc.SaveToFile(fmt.Sprintf("%s/ok_%s.docx", fileLocal, timeNow))
+}
+
+func addRow(table *document.Table, col1, col2 string) {
+	row := table.AddRow()
+	rowCell := row.AddCell()
+	rowCell.Properties().SetWidthPercent(60)
+	rowCell.AddParagraph().AddRun().AddText(col1)
+	row.AddCell().AddParagraph().AddRun().AddText(col2)
+}
+
+// 插入合并后的图片到表格内
+func (wd *WordInfo) InsertSingleImage(table *document.Table, data []byte) {
+	row := table.AddRow()
+	row.AddCell().AddParagraph().AddRun().AddText("测试结果截图")
+	///row = table.AddRow()
+	ParagraphTemp := row.AddCell().AddParagraph()
+
+	img1, err := common.ImageFromBytes(data)
+	if err != nil {
+		log.Fatalf("unable to create image: %s", err)
+	}
+	// 创建一个图片对象
+	image, err := wd.doc.AddImage(img1) // 替换为实际图片路径
+	if err != nil {
+		log.Fatalf("unable to doc.AddImage: %s", err)
+	}
+	inlineDrawing, err := ParagraphTemp.AddRun().AddDrawingInline(image)
+	if err != nil {
+		global.Logs.Fatalf("unable to doc.AddImage: %s", err)
+	}
+	inlineDrawing.SetSize(100, 100) // 设置图像大小为 100x100 像素
+
+}
+
+func (wd *WordInfo) InsertImages(table *document.Table, data [][]byte) {
+	row := table.AddRow()
+	ParagraphTemp := row.AddCell().AddParagraph()
+	for _, v := range data {
+		img1, err := common.ImageFromBytes(v)
+		if err != nil {
+			log.Fatalf("unable to create image: %s", err)
+		}
+		// 创建一个图片对象
+		image, err := wd.doc.AddImage(img1) // 替换为实际图片路径
+		if err != nil {
+			log.Fatalf("unable to doc.AddImage: %s", err)
+		}
+		_, err = ParagraphTemp.AddRun().AddDrawingInline(image)
+		if err != nil {
+			global.Logs.Fatalf("unable to doc.AddImage: %s", err)
+		}
+		//inlineDrawing.SetSize(100, 100) // 设置图像大小为 100x100 像素
+
+	}
+}

+ 18 - 0
internal/utils/utils.go

@@ -2,6 +2,7 @@ package utils
 
 import (
 	"fmt"
+	"os"
 	"regexp"
 	"strings"
 )
@@ -27,6 +28,7 @@ func ContainsKeyword(input string, keyword string) bool {
 	return strings.Contains(input, keyword)
 }
 
+// 是否插入为大对象(需要更改位置)
 func IsInsertBlob(input string) int {
 
 	re := regexp.MustCompile(`values\(([^)]*)\)`)
@@ -36,3 +38,19 @@ func IsInsertBlob(input string) int {
 	}
 	return 0
 }
+
+// 检测文件夹是否存在
+func CheckFolder(folderPath string) bool {
+	_, err := os.Stat(folderPath)
+	return !os.IsNotExist(err)
+
+}
+
+// 创建文件夹
+func CreateFolder(folderPath string) error {
+	err := os.MkdirAll(folderPath, os.ModePerm)
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 0 - 7
logs/xuguALL_2024-03-25 11.07.24txt

@@ -1,7 +0,0 @@
-[2024-03-25 11:07:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString 
-QueryString().sql: 
-%!(EXTRA string=select * from t3;) 
-[2024-03-25 11:07:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: 
-%!(EXTRA string=select * from t3;) 
-[2024-03-25 11:07:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t3;
- 

+ 0 - 6
logs/xuguALL_2024-03-25 11.14.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:14:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t3;
- 
-[2024-03-25 11:14:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:14:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 

+ 0 - 4
logs/xuguALL_2024-03-25 11.15.24txt

@@ -1,4 +0,0 @@
-[2024-03-25 11:15:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:15:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 

+ 0 - 12
logs/xuguALL_2024-03-25 11.16.24txt

@@ -1,12 +0,0 @@
-[2024-03-25 11:16:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:16:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:16:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 
-[2024-03-25 11:16:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:16:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:16:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 0 - 0
logs/xuguALL_2024-03-25 11.22.24txt


+ 0 - 6
logs/xuguALL_2024-03-25 11.27.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:27:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:27:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:27:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 0 - 6
logs/xuguALL_2024-03-25 11.48.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:48:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:48:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:48:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 0 - 6
logs/xuguALL_2024-03-25 11.50.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:50:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:50:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:50:24] [info] db.go:37 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 0 - 6
logs/xuguALL_2024-03-25 11.53.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:53:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:53:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:53:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 0 - 6
logs/xuguALL_2024-03-25 11.54.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:54:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:54:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:54:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 0 - 6
logs/xuguALL_2024-03-25 11.57.24txt

@@ -1,6 +0,0 @@
-[2024-03-25 11:57:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t1;
- 
-[2024-03-25 11:57:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t2;
- 
-[2024-03-25 11:57:24] [info] db.go:38 xgAutoTest/internal/dbBase.QueryString QueryString().sql: select * from t4;
- 

+ 20 - 4
main.go

@@ -1,16 +1,32 @@
 package main
 
 import (
+	"fmt"
 	"xgAutoTest/internal/auto"
+	"xgAutoTest/internal/config"
 	"xgAutoTest/internal/dbBase"
-	"xgAutoTest/internal/logs"
+	"xgAutoTest/internal/global"
+	"xgAutoTest/internal/utils"
 )
 
 func main() {
-	logs.Log = logs.InitLogger()
-	dbBase.InitDb("10.28.20.101", "5190", "TESTDB", "SYSDBA", "SYSDBA")
-	auto.AutoRun()
+	config := config.ConfigInfo{}
+	config.GetConfigInfo("./file/test.txt")
+	//dbBase.InitDb("10.28.20.101", "5190", "TESTDB", "SYSDBA", "SYSDBA")
+	fmt.Println(config.DbInfo)
+	dbBase.InitDb(config.DbInfo.Ip, config.DbInfo.Prot, config.DbInfo.Database, config.DbInfo.User, config.DbInfo.PassWord)
+	checkAll()
+	global.Init()
+	auto.AutoRun(config)
 	db := dbBase.GetDb()
 	defer db.Close()
 
 }
+
+func checkAll() {
+	//检查文件夹
+	ret := utils.CheckFolder("./file")
+	if !ret {
+		utils.CreateFolder("./file")
+	}
+}