The positioning of this product is to solve several major pain points in the traditional software development process:
Project: Unclear requirements, heavy tasks, multiple functions, tight development cycles, and high difficulty in project management;
Benefit: Software developers have high requirements and invest a large number of personnel;
Standard: The degree of customization is high and difficult to standardize, making it difficult to take over the original project;
Iteration: Excessive investment in iteration and updates, and long upgrade and maintenance cycles.
Low technical requirements: A person with about 1 to 2 years of development experience can replace a technician with 5 years of experience, as long as they have basic software knowledge;
High development efficiency: Reduce 90% of the code volume, with most functions implemented through automated configuration. If you are an experienced developer, efficiency can be increased by more than 5 times;
Instant publishing: From configuration to API interface generation, it generally takes less than 2 seconds, and the efficiency of front-end and back-end collaborative development is extremely high;
High degree of standardization: Refined simple standard rules to achieve complex business operations, meeting the needs of high personnel mobility and rapid iteration and upgrading;
Bug defects greatly reduced: Through simplification, standardization, and the use of defect detection tools, defects in development are reduced by more than 70%;
No intrusion: Support integration and integration with various development language framework platforms without affecting the original development framework.
There are many so-called Low-Code or No-Code platforms that are popular on the market now, which can quickly build forms and processes. However, the complexity of actual business systems is masked by the appearance of fast implementation. They can only be used for some simple applications (such as single tables or simple associated applications), and can only target customers with very simple requirements, but cannot meet enterprise level complex applications.
To achieve enterprise level complex applications, the development platform must meet the following requirements:
Application Implementation: To be able to deploy in actual project environments, without relying on third-party online platforms, localized deployment, and adaptable to various environments.
Complex Business: Not just simple business, it should be able to support business collaboration, logical operations, multi table operations, transaction processing, and third-party integration.
Data Structure: The data structure is open rather than closed, supporting custom data structures. The data structure should be decoupled from the platform to facilitate secondary development and data utilization.
System Integration: Cannot be invasive or exclusive, facilitating seamless integration with other development platforms and traditional development models.
Important
This product not only meets the requirements of efficient, low-cost, and fast construction of business systems, but also supports the implementation of enterprise level complex applications very well.
The official version of the product supports databases such as MySql, SqlServer, Sqlite, etc.
Note
In order to demonstrate the functionality more quickly, the demo version of the product only supports the Sqlite database
The product includes three catalogs:
Server side web system
Client Tools
Database files
Important
The client currently only supports Windows systems, while the server is written by NetCore and supports cross platform.
Server: Windows OS, Linux, Unix, dotnet sdk 6.0 or above.
Client: Windows OS, dotnet framework 4.8 or above.
Run FTFrame.Web.exe program,The default port is 81,If you want to change the port, you can run it on the command line, for example, to replace it with port 88 :
dotnet FTFrame.Web.dll --urls http://0.0.0.0:88
The screen after startup is as follows:

Access in browser after startup http://localhost:81/ ,the following interface appears:

Enter your account and password (default account is user, password is 123), click the login button to enter the online document management page:

Open the FTDP. exe program in the client tool directory, and the demo1 site has been opened by default.

Click on the right-click menu in the workspace New Page:


Click Build Single Table Components ,Pop up the form for selecting a data table:

Select a data table, for example tb_client :

Click OK,it will generate a file containing Data List,Data Add,Data Modify,Data Query series components and default configuration.

By using the shortcut key Ctrl+Q, the page can be published to the server. The publishing process takes about 1 second to complete. Once we access the server address, we will see the four newly generated interfaces.

Note
According to the default configuration of the server, two source files, NetCore and Java, will be generated. The source files of NetCore can be directly accessed and tested, while the Java source files need to be configured in the Java environment before they can be accessed and tested.
The generated Api interface can be directly called by the front-end, and this product also provides the function of directly generating Vue front-end components and front-end pages based on the interface.
Right click in the component area of the page editing and select from the menu Go To Front-end ,can quickly generate front-end components.

What is selected here is Data List component,now click Import From Api, can automatically complete the docking of the front and back ends:

Select Live Preview ,We can call the embedded browser to view the configuration effect of the front-end components in real-time:

For more functions on generating front-end components and front-end pages, please refer to the relevant documentation on front-end development.
By accessing the server address through a browser, you can view and test the API documentation. Click on Column Custom to select more columns (such as input and output message formats). Click on the Net or Java link to import the API into PostMan for running and testing.

The generated front-end components can be viewed and downloaded online from the front-end component list for their effects:

The prerequisite for development is to have a site and have completed the main configuration, which includes server configuration and database configuration.
The demo version has already added demo1 site by default, and its configuration matches the demo server.
You can add sites through Add Site and Register Site. The difference between the two is that Add Site can be added without matching the server first. When Register Site, it is necessary to verify whether the server matches before adding it.
You can add and register sites through the main menu or site management.

When collaborating with multiple developers, registered sites can be quickly registered by exporting configurations and then importing configurations.

| Field | Description |
|---|---|
| ID | Site ID, mandatory |
| URL | The address of the server |
| User | The sysuser field of ft_sites in the platform database |
| Password | The syspasswd field of ft_sites in the platform database |
| Key | CDKey,corresponding to the SiteCDKey in the server configuration file |
| Domin | Displayed domain name |
| Caption | Display name |
| Group | Group |
Two ways to open a site:
1: Menu File ->Open Site, double-click the site you want to open.

2: Set default site in menu tools ->options, so that when opening the client tool, the site will be opened by default.

Menu Site ->Export Site, export all files and configurations of the current site to a local file.
Menu Site ->Import Site, import local site files into the current site.
Warning
When importing a site, incremental import is used. If there are pages with the same file name, you can choose whether to replace them.
If there are pages with the same file name and the current site has not been backed up, full replacement may result in data loss for the current site.
When collaborating with multiple developers, the latest files and configurations on the server can be synchronized locally.
Note
When publishing, the server will automatically complete each backup function and synchronize the latest version during synchronization.
To roll back to a historical version, you can use Site Version Management to perform a full site rollback, or use Page Version Management to perform a historical rollback of individual pages and components.

| Type | Description |
|---|---|
| Blue background | Indicates that the file server version is newer and requires synchronization by default |
| White background | Indicates that the file server version is the same as the local version and does not require synchronization by default |
| Yellow background | Indicates that the file server version is older than the local version and does not require synchronization by default |
| Local is empty | Indicates that the file server exists but not locally, and synchronization is required by default |
Site version management is the version management of the entire site, where version generation can be done according to:
Latest generated version
Historical snapshot version: Select a point in time where all files closest to and before that point in time form a version

The operation of the version includes: viewing details, rolling back to the current site, downloading or exporting the version site.
Site publishing refers to publishing the specified files of the current site to the server, including several types: full publishing, specified publishing, and quick publishing.
Suggest using a quick publishing method to publish the current individual page. There are three ways to quickly publish:
Ctrl+Q shortcut key, quickly publish the currently being edited page;
Select the page in the workspace, right-click on the menu, and select publish the page;
Menu Tools ->Quickly publish the current activation page.
Select the root node in the workspace and configure the site properties in the attribute area.

The main configuration instructions for attributes are as follows:
| Field | Description |
|---|---|
| NetCore Local Output Path | Optional. Output the published source file locally for building a local NetCore web project |
| Java Local Output Path | Optional. Output the published source file locally for building a local Java Web project |
| ID | Site ID, mandatory |
| URL | The address of the server |
| User | The sysuser field of ft_sites in the platform database |
| Password | The syspasswd field of ft_sites in the platform database |
| Key | CDKey,corresponding to the SiteCDKey in the server configuration file |
| Domin | Displayed domain name |
| Caption | Display name |
| Group | Group |
Perform basic operations on site directory structure and pages in the workspace.
In the workspace, right-click menu ->New Directory

When creating a new directory, you can perform directory copying operations. The directory copying function is to regenerate instances of all subdirectories, pages, and components under the specified directory and then copy them to the new directory.
Click on the directory to be copied:

To change the directory display name, you can make modifications in the properties section:

A page is an editing unit that has two output modes::
Traditional page output mode: output HTML code, and components nested within the page generate dynamic HTML according to their positions, which can be directly accessed by browsers;
JSON output mode: output JSON code. Components nested in the page will output JSON code based on the page URL parameters, which is used to implement the API interface.
The default output method is JSON. To change the page output type, modify it through the output method of the page properties:

In the workspace, right-click menu ->New Page:

In the actual development process, if the functionality of this page is very similar to that of another, it is often copied. If you want to copy another page, you can choose it by browsing:

Warning
If another page containing components is copied, then these component instances have not been regenerated and need to be regenerated using the method of Clone and Replace on the page to generate new component instances.
When creating a new page, you can quickly build a single table series of components and pop up a data table selection interface:

Select a data table, for example tb_client :

Click OK,it will generate a file containing Data List,Data Add,Data Modify,Data Query series components and default configuration.

After generating the basic components, adjustments and modifications can be made according to business needs.
In collaborative development or multiple project development, there is often a situation where the feature I want to do is similar to another project, or if this feature needs to be referenced and copied by other developers, the export and import functions of the specified page can be used.
In the workspace, select the page, right-click on the menu ->Export the page for export, use the menu tools ->Import a single page and then import it again.
In the workspace, double-click the page with the mouse to open it, or right-click the menu to open the page.
Every release of the page will be automatically backed up on the server.
In the workspace, select the page, right-click on the menu ->Historical Backup for backup management. You can view all historical backups, select them, and roll them back, or download and export them.

Page publishing is the process of publishing the content and configuration of a page to the server for operations such as API generation, document generation, version generation, and source file generation for NetCore and Java.
Page publishing adopts a fast publishing method, publishing the current single page. There are three ways to quickly publish:
Ctrl+Q shortcut key, quickly publish the currently being edited page;
Select the page in the workspace, right-click on the menu, and select publish the page;
Menu Tools ->Quickly publish the current activation page.
Under normal circumstances, the publishing time is around 1 to 3 seconds.
After opening the page, enter the page visualization editing environment, which supports regular HTML visualization WYSIWYG editing. The editing window is divided into three parts: design area, code area, and preview area, which include regular HTML editing functions. Select HTML elements and make attribute modifications in the attribute area.

Note
The HTML of a component is a non editable region and can only be set through the properties of the component.
Note
The page will be automatically saved in the following situations: when publishing, when switching editing status, when closing the page, when clicking the save menu or button.
The component properties will be automatically saved after any property modification.
The right-click menu on the page is divided into component functions, page editing functions, and auxiliary functions. This chapter will first only introduce auxiliary functions.

| Menu | Function |
|---|---|
| Copy Page Path | Copy the relative path of this page to the clipboard |
| Copy API Information | If the component defines an interface, copy the basic information of the component's related interface |
| Postman Test | If the component has defined an interface and has been published to the server, copy the interface test address and import it in Postman |
| Go To Front-End | If the component defines an interface, then move on to the front-end component development associated with the interface, facilitating quick collaboration and adjustment between the front-end and back-end |
Menu Tools ->Options, set global client settings.

The settings related to display classes are not listed one by one, mainly the following items:
| Item | Description |
|---|---|
| VSCode Path | Set VSCode path, right-click on the page to open VSCode, for mixed development |
| Default Output | The default output method when creating a new page, usually JSON |
| Developer Name | My display name will indicate the developer in documents and shared information during collaborative development |
| Default Site | When opening the client, the site will be opened by default |

Important
It is strongly recommended to configure the server-side database link, or to configure a database link with the same structure as the server-side database.
After configuring this option, a large number of automated configurations, data table or field prompts, bug detection, and other functions can be achieved.
| Item | Description |
|---|---|
| Site | A site can be configured with either a business database or a platform database. If a platform database is not configured, it is equivalent to a business database |
| Type | Database type,currently, automation configuration supports MySql, SqlServer, and Sqlite |
| Connection String | Database Connection String |
The use of components is the core of this product, and based on refinement, we have found that conventional business functions can be decomposed into the following three or a combination or nesting of these three:
Data List: Multiple pieces of data with the same structure, such as lists, dictionaries, options, etc., and batch operations on multiple pieces of data
Data Operation: The combination operation of adding, modifying, or adding and modifying a certain piece of data
Data Getting: Obtain the content of a certain piece of data
In actual business scenarios, we need to combine and nest these three types, and there will be certain logical judgments. However, more than 80% of business scenarios cannot do without these three types.
So by mastering these three types of component configurations, almost 80% of the development content of regular business systems has been completed.
There are three ways to add new components:
1: Right click in the editing area to insert a component:

2: Left toolbar ->Standard components, drag and drop components to the editing area:

3: Workplace components, drag component instances to the editing area:

In actual development scenarios, the features we want to add are partially similar to those that have already been developed, and we can use replication or cloning methods.
1: Select the component on the page you want to copy, use Ctrl+C or right-click to copy, and use Ctrl+V or right-click to paste it into the editable area of the new page;
Warning
If another component is only copied in this way, then these component instances have not been regenerated and need to be regenerated using the method of Clone and Replace on the page to generate new component instances.
2: Clone and Replace: Copy all configurations of the component, regenerate the component instance, and replace the original in the editing area;
3: Clone and Append: Copy all configurations of the component, regenerate the component instance, and append a new component below the original component;
4: Clone: Copy all configurations of the component, regenerate the component instance, and the new component will only appear in the component area of the workspace.

Select a component in any way to edit its configuration in the attribute area.
To meet different application scenarios, components can be selected in all three regions:
Left toolbar ->Page shortcut operation area, select the component
Visual area selection component in the page editing area
Select components in the tree structure of the workspace (under page node)

In order to meet the needs of different scenarios, the number of component attributes will be greater than the configuration requirements required for our specific project, and the attention and importance of these configuration items in our actual business scenarios will also vary.
We can now customize the display and sorting of component properties. After selecting a component, the property area displays all the configurable properties of the component. In the right-click menu ->Component Shortcut Property in the editing area, only the few property configurations that we are interested in will be displayed.

Click Setting to customize the shortcut properties and sorting of all components:

Only introduce the attribute configuration instructions closely related to Api interface generation.
Note
Property settings may support built-in syntax, please refer to the built-in syntax rules
| Property | Description | Example |
|---|---|---|
| Main Table | Optional. Select through the table selection tool. When the fully customized query is empty, define the data source according to the main table identifier. This property must be set during batch operations. Note: Views can be configured | @tb_client |
| Fully Custom SQL | Defining a basic data source using SQL must end with a where condition and cannot end with sorting | select * from tb_client where 1=1 |
| Default Order By | When the Api input parameter does not include sorting, use the default sorting rule | order by id desc |
| Define Columns | See Data Rule Configuration for details | |
| API Setting | See Api Configuration for details |
Double click on the selected component at any location, or click on property configuration or shortcut property configuration to configure data rules.

Defined column display names, comments (to be displayed in the generated Api document), data definitions, etc.
If the basic data source has already been defined (with main table identification or fully customized queries configured), columns can be quickly defined from the data structure through Quick Define , such as:

Rules for defining data:
| Rule | Example |
|---|---|
| To display a combination of multiple data in a column, use a semicolon ';' Separate | name;date |
| [] syntax: Used within other syntax, use square brackets [colname] to represent the value of column name colname in the base data source | |
| @str() syntax: Represents an output constant, where the '[]' syntax can be used, such as @str(My name is [name]) | @str(100) |
| @SQL {} syntax: Output the SQL query result, and automatically match the result set format (single value, multi value, multi row) when outputting JSON. Supports @p[n]@ and [] syntax | @SQL{select name from tb_client where id='@p1@'} |
| @api_:Docking with other lists or obtaining Api interfaces | @api_/dir/page?list/[id] |
| ! Start representing switch syntax | !colname(null|v1)(|v2)(2|v3)(other|v4) |
| @KeyValue {col, 1, SQL} syntax: Based on the SQL statement of keyValue, escape the column. The second parameter 0 is all escaped, 1 is only exported with escape, and 2 is only the list escaped | |
| Other syntax support:@code,@para |
Api Define Quickly Configure Api Interface through Data Rule Configuration.

Note
A data rule configuration can generate multiple Api interfaces as needed, such as different open input parameters, support for batch modification, and different default parameters.
Hidden parameters isExport, exportMax, and exportName represent the input parameters when exporting to Excel
Custom export file names can override the system's default timestamp generated file names during export
There are two types of input methods: JSON input or form input, usually JSON input
Please refer to the description of each field for detailed instructions on entering parameters
Important
The key of the message that was not hit during parameter input will be automatically ignored.
After quick publish, browse the Api document online. The example of the Data List document is as follows:

Only introduce the attribute configuration instructions closely related to Api interface generation.
Note
Property settings may support built-in syntax, please refer to the built-in syntax rules
| 属性 | Description | Example |
|---|---|---|
| Primary Key Column | Optional. This item can override the primary key rules defined in the Project project | |
| Default Primary Key Value | Optional. This item can override the primary key value rules defined in the Project project | |
| Update Reserved Columns | Do you want to automatically update the retention column update rules defined in the Project project | Yes |
| Operation Premise: Sql | Define whether Data Operation can be performed using Sql | |
| Operation Premise: Code or Param | Define whether Data Operation can be performed using @code or @para | |
| SQL Execution: Before Operation | SQL executed before operation | |
| SQL Execution: After Operation | SQL executed after operation | |
| Code or Param: Before Operation | @code or @para executed before the operation | |
| Code or Param: After Operation | @code or @para executed after the operation | |
| Rule Define | See Data Rule Configuration for details | |
| API Setting | See Api Configuration for details |
Double click on the selected component at any location, or click on property configuration or shortcut property configuration to configure data rules.

Name or annotation, application scenario is:
Prompt text given when validation is configured and the field validation fails
Comment for this field in the Api document
The field for Api input must be unique.
Note
If starting with an underline '_', this field will only be processed by the server and will not be opened to the front-end.
For example, when adding data, if a certain field needs to store the current server's time, there is no need for front-end input parameters, while processing by the server does not require front-end opening.
Bind database tables and fields. When the row is configured with subtable operations, only bind the data subtable. Double click for quick configuration.
Important
Multiple different data tables can be bound simultaneously!
Main types of explanations:
| Type | Description |
|---|---|
| Add | This field is a new operation |
| Mod | This field is a modification operation |
| Auto | This field will be determined based on the filtering rules whether to add or modify it. The filtering rules can be the "where" condition, and if it exists, it will be modified. If it does not exist, it will be added |
| Sub Table Add for Json | Configure to add sub tables, and add all sub table objects in the message to the sub table |
| Sub Table Reset for Json | Configure to reset the sub table, delete the relevant data of the sub table according to the where condition of the advanced column configuration, and then perform the operation of adding the sub table |
| Sub Table Update for Json | Configure as subtable update, based on the subtable objects in the message, perform only update operations according to the subtable primary key |
Quick settings for validation rules, more complex validation rules are set in the premise of operating the main attributes.
Generally used for querying or updating. A、 Filter data using column name=value (default to primary key column as filter column)
Definition of primary key column (1) , default to the primary key column name rule configured in the Project project; (2) The component parameter "primary key column name" can overwrite or redefine all configured filtering column names of the component; (3) Each item in the data rule configuration can override the above definition again. When overriding the filter column definition, the filter value must also be defined, such as @p1@, idCustom, which means the filter rule is idCustom='@p1@'.
Definition of value (1) , default to using the first sequence parameter as the filtering value, i.e. @p1@; (2) The default primary key value of the component parameter can override or redefine the filtering values for all configurations of the component; (3) Each item defined by the rule can once again override the above definition, such as @p2@, or for example @key(idCustom);
Note
Each item defined by the rule can have only filter values defined, or both filter values and filter columns can be defined simultaneously (separated by,), and filter columns cannot be defined separately.
B、 Custom filtering criteria
"where" starting string, for example, where name='@key(user)' and area='@p1@'.
C、 Built in syntax supported by configuration items:
Sequence parameters @p[n]@, such as @p1@, @p2@;
@key ([name]), obtained from input parameters, such as @key(username);
@code ([define]), obtained from the defined backend method;
@enum([define]), obtained from the enumeration defined by the site parameters;
@dic([define]), obtained from the dictionary table defined by the server;
@para{[define]}, obtained from the site parameter definition;
@from([@table. col]), obtain the final value from other fields.
A、 Configuration rules
If it is not empty, the default return is the filled string, ignoring the input parameters;
When configured as @sql: starting string, return the SQL query value (first row, first column);
B、 Built in syntax supported by configuration items:
Sequence parameters @p[n]@, such as @p1@, @p2@;
@key([name]), obtained from input parameters, such as @key(username);
@code([define]), obtained from the defined backend method;
@enum([define]), obtained from the enumeration defined by the site parameters;
@dic([define]), obtained from the dictionary table defined by the server;
@para{[define]}, obtained from the site parameter definition;
@from([@ table. col]), obtained from the final values of other fields;
Other: @empty@ "empty string" value, @newfid@ primary key value when adding.
When configuring sub table operations to reset or update, advanced columns need to be configured with filtering conditions.
Configuration can be quickly completed from data structures through Quick Define , such as:

Quickly select and configure the data table after selecting it:

Select All: Select all fields in the table;
Select All (ignoring primary key columns, retaining columns): Select all columns except for primary key columns and retaining columns.
Note
The primary key column and reserved column are defined by rules in the Project project.
Data Operation, operations can be performed on its child tables simultaneously. The example configuration is as follows:

Double click on the name or key column to configure sub table details:

Sub table details can also be configured through Quick Define:

The results after configuration are as follows:

The types in the subtable details are generally default. If you need to configure the subtable in the next layer, you can continue to select subtable configuration in the subtable details. The rules are the same as above.

Important
The operation of the main table can mix multiple types and multiple data tables, and the number of layers of sub tables can be unlimited. Therefore, the application of the Data Operation component can cover the vast majority of operations related to data in conventional business.
According to the previous relationship between the parent-child table, the child table can be configured with special values, including the following types:
Primary Key Value of sub table (If the primary key rule for this sub table is defined in the Project project, it is generally not necessary to configure this item)
Primary Key Value of parent table (The primary key value of the associated parent table. If the parent table is newly added, the primary key value of the new record in the parent table will be automatically associated)
Same Name Value of parent table (For special application scenarios, obtain field values with the same field names in the parent table based on the bound field names)
By configuring data rules through Api Define, Api interfaces can be quickly configured, and input parameter fields can be adjusted and mapped again.

Note
A data rule configuration can generate multiple Api interfaces as needed, such as opening different input parameters.
There are two ways to input parameters: Json or Form, usually Json.
Please refer to the description of each field for detailed instructions on entering parameters.
Important
1,The keys that was not hit during parameter input will be automatically ignored.
2,If starting with an underline '_', this field will only be processed by the server and will not be opened to the front-end.
After quick publish, browse the Api documentation online. An example of the Data Operation documentation is as follows:

Only introduce the attribute configuration instructions closely related to Api interface generation.
Note
Property settings may support built-in syntax, please refer to the built-in syntax rules
| Property | Description | Example |
|---|---|---|
| Primary Key Column | Optional. This item can override the primary key rules defined in the Project project | |
| Default Primary Key Value | Optional. This item can override the primary key value rules defined in the Project project | |
| Exist Reserved Columns | Is there a reserved column defined in the Project project | Yes |
| Execute Before Getting | Obtain previous execution, support @code,@para,@sql:,@api_ , etc | |
| Execute After Getting | Execute after obtaining, supporting @code,@para,@sql:,@api_ , etc | |
| Rule Define | See Data Rule Configuration for details | |
| API Setting | See Api Configuration for details |
Double click on the selected component at any location, or click on property configuration or shortcut property configuration to configure data rules.

Name or annotation, application scenario: annotation for this field in Api document.
The field for Api output must be unique.
Bind database tables and fields.
Note
This setting is not mandatory, for example, the output can be defined through the return value in the advanced settings.
Important
Can bind multiple different data tables simultaneously!
Generally used for querying or updating. A、 Filter data using column name=value (default to primary key column as filter column)
Definition of primary key column (1) , default to the primary key column name rule configured in the Project project; (2) The component parameter "primary key column name" can overwrite or redefine all configured filtering column names of the component; (3) Each item in the data rule configuration can override the above definition again. When overriding the filter column definition, the filter value must also be defined, such as @p1@, idCustom, which means the filter rule is idCustom='@p1@'.
Definition of value (1) , default to using the first sequence parameter as the filtering value, i.e. @p1@; (2) The default primary key value of the component parameter can override or redefine the filtering values for all configurations of the component; (3) Each item defined by the rule can once again override the above definition, such as @p2@, or for example @key(idCustom);
Note
Each item defined by the rule can have only filter values defined, or both filter values and filter columns can be defined simultaneously (separated by,), and filter columns cannot be defined separately.
B、 Custom filtering criteria
"where" starting string, for example, where name='@key(user)' and area='@p1@'.
C、 Built in syntax supported by configuration items:
Sequence parameters @p[n]@, such as @p1@, @p2@;
@key ([name]), obtained from input parameters, such as @key(username);
@code ([define]), obtained from the defined backend method;
@enum([define]), obtained from the enumeration defined by the site parameters;
@dic([define]), obtained from the dictionary table defined by the server;
@para{[define]}, obtained from the site parameter definition;
@from([@table. col]), obtain the final value from other fields.
.
Single Row: When outputting Json, this line returns a value;
Multiple Rows: When outputting Json, this line returns an array.
A、 Configuration rules
If it is not empty, it is recognized as SQL by default. The query result is output based on SQL. If Multiple Rows are configured, it is output as an array object. Otherwise, the first row and first column values of the SQL query result are returned;
When configured as @code, return the value of the back-end method;
When configured as sql@code Then return the value of the back-end method as SQL and query it again;
When configured as str@code Then return the value of the original field and call the back-end method with @val@ as the parameter;
When configured as @api_, return the JSON that calls the interface;
When configured as @sql:, it is the same as 1.
B、Built in syntax supported by configuration items:
Sequence parameters @p[n]@, such as @p1@, @p2@;
@key([name]), obtained from the parameter to be output, such as @key(username);
@code([define]), obtained from the defined back-end method;
@enum([define]), obtained from the enumeration defined by the site parameters;
@ dic([define]), obtained from the dictionary table defined by the server;
@para{[define]}, obtained from the site parameter definition;;
Configuration can be quickly completed from data structures through Quick Define, such as:

Quickly select and configure the data table after selecting it:

Select All: Select all fields in the table;
Select All (ignoring primary key columns, retaining columns): Select all columns except for primary key columns and retaining columns.
Note
The primary key column and reserved column are defined by the Project project
By configuring data rules through Api Define, Api interfaces can be quickly configured, and parameter fields can be adjusted and mapped again.

Note
A data rule configuration can generate multiple Api interfaces as needed, such as opening different output parameters.
'Api Call' can conveniently nest calls to other Api interfaces of Data List or Data Getting.
After quick publish, browse the Api documentation online. An example of the Data Getting documentation is as follows:

Not all syntax supports all configurations, please refer to the property setting instructions for details.
Important
@p[n]@ has the highest priority and can be used as a parameter in other syntax.
Function: Calling server-side program methods (requires compilation)
Defined in the Project project or by reflecting remote methods.
The syntax is @code(define,para1|para2|...),define is the identifier, and multiple parameters are separated by |.
Function: Calling basic methods with logical processing and returning a string (No compilation required)
Defined by the site parameter tool. Please refer to the section on practical Tool ->Site Parameters for details.
The syntax is @para{define,para1|para2|...},define is the identifier, and multiple parameters are separated by |.
Important
When defining a @para, nested calls can be made to @para,@code,@p[n]@
Function: Obtaining the values of input and output parameters during Data Operation and Data Getting
The syntax is @key(keyName).
Function: Define a SQL statement
Function: Define an existing Api interface for nested calls or execution
The syntax is @api_/somePage?list/[colname]/@p[n]@.
Function: Sequence parameters used to obtain the specified position when calling the Api interface
For example, when calling an Api interface, the URL is somePage?list/a/b/c,then @p1@ is a,@p2@ is b,@p3@ is c, Supports up to 12 sequence parameters.
Function: Obtain the final value based on the bound field during Data Operation, and obtain the output value of parameter during Data Getting
The syntax is @from(tableName.column),@from(keyName).
Function: The corresponding conversion between values and display text, similar to enumeration
Defined by the Site Parameter tool (starting with Enum_).
The syntax is @enum(key.item),Key is the identifier, item is the item.
This product integrates a large number of innovative and practical tools.
In configuration oriented project development, we will face such problems:
There is a significant amount of duplication in configuration items
Some configurations are not written to death and require dynamic changes based on certain conditions
There are several types of configurations that are very similar, and I want to write them as one configuration
To achieve some unified management of complex configurations
How to rely on and nest between configurations
The combination of several configurations forms a configuration and is managed uniformly
Therefore, we have designed and developed a Site Parameter tool to unify the management of complex, commonly used, and logical configurations. Our built-in syntax can still be used in these configurations, and these configurations can be used in all supported attribute configurations of the entire site.
Menu click on Tool->Site Parameter:

Note
We have made a simple agreement, where 'Enum' starts with enumeration configuration, 'Front' starts with front-end template configuration, '@Front' starts with front-end integration template configuration, and others start with regular configuration.
In the configuration, @para[n]@ is used to represent the input parameters when calling the site parameters. For example, if the calling method is @para{define, @key(name)|9}, then @para1@ is the value of @key(name), and @para2@ is 9.
In the following typical examples, we return different SQL query statements based on the different parameters of the input parameters:

Or a simple SQL concatenation condition:

You can also have the site parameters execute Sql or execute a Data Operations API, with multiple executions separated by ##, for example, performing different operations based on different conditions:

After establishing standardized configuration rules, we can easily detect some errors and defects in the configuration by setting detection rules.
Menu click on Tool->Bug Detection:

Optional detection range: current page, custom detection page, full site detection.
The detection types include: Api configuration detection, front-end configuration detection, and rule design detection.
After clicking the start button, the detection results will be quickly displayed as follows:

Defined the type, location, description, and level of defects.
When there are a large number of configurations, the problem that needs to be solved when adjusting one or a large number of similar configuration items is:
Need to quickly locate a configuration item, rather than opening the location step by step through directories, pages, component properties, etc;
When batch changing a certain type of configuration item, it can be uniformly modified and confirmed without displaying unnecessary configuration items;
After quickly modifying configuration items, updates can be directly published to the server without the need to navigate to the page and publish again.
Menu Tool ->Search in Configuration. We enter the search content and through a full site search, it can help us locate specific configuration items in bulk.

Menu Tool ->Export Database Structure, can export the server-side database structure as an Excel document.
Note
The export format may vary slightly depending on the type of database.
This feature is an exploratory feature that mainly allows business rules to constrain configuration. In bug detection, this rule design will be called to detect some business-related defects.

During page development, HTML editing is done by third-party tools, and this product only does component configuration.
In the Api development scenario, this feature has been deprecated.
Quickly configure front-end components through standardized Api interfaces, and then export front-end pages through front-end page templates.
The front-end development of this product is currently based on the Vue framework, with the UI framework being ElementUI.
Click on the menu Tool ->Front-end Component Generate to open the Front-end Component Generate Tool.

There are several types of front-end components:
List component (corresponding to Data List in Api interface type)
Form component (corresponding to Data Operation and Data Getting in Api interface types)
The left column displays the tree structure of all front-end components. When exporting front-end components, they will be exported according to the hierarchical relationship of the tree structure.
Important
The configuration information of the front-end components is stored locally. To synchronize to the server, it is necessary to publish the front-end components. The shortcut key is Ctrl+Q. After publishing, you can view the list of components on the server through the browse button (providing preview, download, and other functions)
The server-side browsing front-end components are as follows:

The right-click menu in the left column is as follows:

When the front-end components are released, the server will automatically back up. When collaborating with multiple developers, view and download the backup list of the specified components:

Or click Update All to obtain the latest all front-end components on the server.
Generate Page Function: Select a directory that may contain multiple front-end components. Clicking on the page generation function will automatically match the front-end page template and generate front-end pages according to the rules of the page template for the series of front-end components.
Preview Function: Call the browser to preview the effect of local front-end components.
Export Function: Export selected front-end components to local.
Configuration Features: Configure Api call address and related settings:


Important
Save and Export Configuration: After saving the front-end components, they are automatically exported to the local directory structure for collaborative development by third-party development tools.
Eslint program path: Before exporting front-end components, format the front-end code.

Component names with slashes/ indicate directory structure
Specify the Api interface for the Data List, which can be selected through buttons
Click the configuration button to directly go to the page where the interface is located for interface configuration


After defining the list interface, it is easy to automatically dock fields by clicking Import From Api, and fields that do not match the Api interface fields will also be marked in red font.
After selecting Live Preview, call the embedded browser to preview the configuration effect in real time:

Description of each configuration item:
| Item | Description |
|---|---|
| Display | Display text for column |
| Bind | Bind Api interface key |
| Width | Column width |
| Freeze | Whether to freeze this column and the freezing method |
| Sort | Sort or not |
| Select | Is the selection box displayed |
| Template | Define content through template templates, supporting @para syntax |

Define search criteria for the search bar, input methods include text boxes, dropdown selections, dates, date ranges, and custom templates.
The bound field refers to the interface field bound to the search condition, which can be selected by double clicking:

Placeholders are the default displayed prompt text.
Support custom settings for styles.
Initialize template:

The initialization content is a combination of statically defined content and content obtained from the interface. For example, we have defined male and female dropdown options as initialization data:


Configure button types, text, icons, appearance, grouping, and other settings.
Event Setting: Define the click event for this button, select and configure it after clicking.

Built in events include: query, reset, batch operation, export, and customization.

Script definitions include initialization, before loading, before setting, after setting, customization, and styling.


Component names with slashes/ indicate directory structure
Specify the Api interface for Data Getting, which can be selected through a button
Specify the Api interface for Data Operation, which can be selected through buttons
Click the configuration button to directly go to the page where the interface is located for interface configuration
Important
In general:
When adding: Do not configure Data Getting, configure Data Operation
When modifying: configure Data Getting and Data Operation
When viewing: Configure Data Getting, do not configure Data Operation

After defining the interface, it is easy to automatically dock fields by clicking Import From Api. You can choose to import from Data Getting or Data Operation, and fields that do not match the Api interface fields will also be marked in red font.
After selecting Live Preview, call the embedded browser to preview the configuration effect in real time:

Description of each configuration item:
| Item | Description |
|---|---|
| Display | Display text for form items |
| Bind | Bind Api interface key |
| Type | ![]() It contains more than ten types, and the most special one is the built-in Integration Template type, which is configured by site parameters |
| Placeholder | Displayed prompt text |
| Style | Define styles |
| Initializate | ![]() The initialization content is a combination of statically defined content and content obtained from the interface. For example, we have defined male and female dropdown options as initialization data: ![]() |
| Template/Property | Define attributes or define content through template templates, supporting @para syntax |
| Validation | ![]() Choose built-in validation rules or custom validation rules |
| Layout | Customize the layout and set the number of form items displayed in each row |
The last type of form item is the integration template, which is defined by site parameters. In actual business scenarios, form items are composed of a large number of front-end code combinations, and even have coupling relationships with the data of other form items, such as cascading selection, file processing, image upload and display, rich text editing, and the combination of multiple form items.
Commonly used integration templates have been configured through site parameters, such as:

When using, simply select the integration template type, then select the corresponding integration template and configure the input parameters to achieve complex front-end scenarios:


Configure button types, text, icons, appearance, grouping, and other settings.
Event Setting: Define the click event for this button, select and configure it after clicking.

Built in events include: submit, reset, and customize.

It is recommended to use the default configuration, which is automatically generated when exporting components and matches automatically based on the interface type.

It is recommended to use the default configuration, which is automatically generated when exporting components and matches automatically based on the interface type.

The script definition includes initialization, before getting, before setting, after setting, before submitting, after submitting, customization, attaching data objects and styles.

Click on the menu Tool ->Front-end Page Generate to open the Front-end Page Template Configuration Tool.

Configure the template code and the component types related to the template. After saving, the page can be generated in the front-end component development tool.
Warning
The generation page function of template management has been discontinued, and the generation page function has been integrated into the front-end component tool.
Select the directory of the component tree structure of the front-end component generation tool, right-click to select the generation page, select the template to be applied, and then generate the front-end page for the series of front-end components according to the rules of the page template.
Most text configurations will be completed within the text editor.

The text editor supports automatic completion and click prompts, with completion types including SQL syntax, data tables, data table fields, and various built-in syntax.
Quick definitions include:
Site Parameter
Common Configurations:

Assembly Calls

Can directly select public methods for server-side programs:

When collaborating with multiple people, server methods defined by other developers can be synchronized.
The configuration returned by assembly method calls is @code syntax, and the methods defined in the Project project are regular calls.
If other custom methods are configured with dynamic compilation on the server, they are called normally. Otherwise, the method is called through reflection.
Script Calls
Api Calls

Select published Api interfaces for calling.
Most SQL configurations will be completed within the SQL editor.

The SQL editor supports automatic completion and click prompts, with completion types including SQL syntax, data tables, data table fields, and various built-in syntax.
Sql templates can be defined in the abstract fragment in advance, and can be quickly selected in the SQL editor.
The edited SQL query statement can be tested and data previewed by clicking the test button.

The summary column on the left toolbar defines snippets for quick input.

The commonly used [SQL] starts with SQL statement templates, and [Front] starts with front-end templates.
Classify and manage sites for specific business scenarios.
Check if the client tool is updatable, download and restart the client tool to complete the update operation.
International applications.
Currently supports both English and Chinese, with an increasing number of languages as needed.
The server project is .Net Core Web Project
Run FTFrame.Web.exe program,The default port is 81,If you want to change the port, you can run it on the command line, for example, to replace it with port 88:
dotnet FTFrame.Web.dll --urls http://0.0.0.0:88
The screen after startup is as follows:

Access in browser after startup http://localhost:81/ The following interface appears:

Note
The official version provides the source code of the web project and supports database types of MySql, SqlServer, and Sqlite.
The configuration files are located in the appsettings.json and job.json directory at the root of the web project. After making changes, the web service needs to be restarted.
appsettings.json :
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "DataBase": { "DataBaseType": "Sqlite", // Database type,for example:MySql , SqlServer , Sqlite "ConnectionStr": "Data Source=../db/test.db;", "ConnectionStr_ReadOnly": "", // If it is empty, then the same as ConnectionStr "ConnectionStr_FTDP": "Data Source=../db/test_plat.db;", // Just for FTDP Server Required Tables, If it is empty, then the same as ConnectionStr "ModelDllName": "FTFrame.Project.Model" }, "LogLevel": "2", //"Jwt": { // "SecretKey": "", // "ExpiresMinutes": "30", // "Domin": "http://localhost" //}, "Site": { "LogPath": "../ftsite_log", "SystemName": "FTDP Server", "SystemTitle": "FTDP Site", "CodeGetCompile": "false", "SettingEncode": "false", "SubPath": "", "HostReferrer": "", "RoutePathReplace": "", "OriginAllowed": "*" }, // Generate Java files simultaneously when generating net core files,if the setting of RootPath is empty,then ignore "Java": { "RootPath": "../ftsite_java", // The path generated by Java source files "JarName": "FTFrameWeb-0.0.1-SNAPSHOT.jar", // The name of the generated jar package "BaseUrl": "http://localhost:9330", // java web site address "Port": "9330", // java web site port "JAVA_HOME": "/home/ubuntu/jdk1.8.0_341", "MAVEN_HOME": "" // If empty, will not dynamically compile and deploy, only generate source files }, "Publish": { "SiteBak": "../ftsite_bak", "IsApiCompile": "false", "DllCompilePath": "", "RegisterNumber": "", "RegisterSiteKey": "MyCustomCDKey" // Must be same with FTDP Client CDKey,otherwise the client can not publish to this site }}
job.json : Configure scheduled tasks, task execution types include WebApi (calling Api interface) and Function (calling assembly methods)
xxxxxxxxxx[ { "interval": "hour", //hour,day,month "trigger": "18:10", // "job": [ /* { "type": "WebApi", "value": "http://aaa" }, { "type": "Function", "value": "FTFrame.BLL,FTFrame.BLL.Busi,Cacu_Index" }*/ ] }, { "interval": "day", "trigger": "01:00:00", "job": [ /*{ "type": "Function", "value": "FTFrame.BLL,FTFrame.BLL.Busi,Cacu_Index" }*/ ] }]
This project is the core of server configuration, and the main configuration items are introduced here.
After compiling the project, replace FTFrame.Project.Core.dll file, then restart the server service.
Can redefine database types and connections
Configuration logic for read-only databases
Configuration rules for primary keys (generation rules for primary key columns and primary key values)
Preprocessing of data field output
Rules for retaining columns when adding new data
Preserve column rules when modifying data
xxxxxxxxxx/// <summary> /// Based on the actual situation of database design, define the logic for obtaining primary keys, retaining fields, and storing them /// </summary> public static class DBSuit { /// <summary> /// Obtain a read-only database connection string, and define rules when there are multiple read-only databases. /// If 'Data List' or 'Data Getting' with data operations (as Batch updates,Execute after getting) cannot be used as read-only /// </summary> /// <returns></returns> public static (DBClient.DataBase DataBaseType, string ConnString) ReadOnlyConnection(HttpContext context) { // Multiple read-only databases can be specified according to rules // Connection strings can be obtained from the configuration file, for example:ConfigHelper.GetConfigValue("Project:ConnString_V1") return (DBConst.DataBaseType,SysConst.ConnString_ReadOnly); } /// <summary> /// Obtain the basic database connection string (read-write) and define rules /// </summary> /// <param name="context"></param> /// <returns></returns> public static (DBClient.DataBase DataBaseType, string ConnString) BaseConnection(HttpContext context) { return (DBConst.DataBaseType, SysConst.ConnString); } /// <summary> /// Important:Rules for defining primary key values /// </summary> /// <param name="tableName"></param> /// <param name="fidCol"></param> /// <returns></returns> public static (string KeyName, Enums.KeyType KeyType) Key(string tableName, string fidCol = null) { switch (tableName.ToLower()) { case string r when (r.StartsWith("cn_") || r.StartsWith("ef_")): return ("id", Enums.KeyType.AutoIncrement); case string r when (r == "ft_test_table"): return ("fid", Enums.KeyType.Guid); default: if (string.IsNullOrEmpty(fidCol)) return ("id", Enums.KeyType.SnowId); else return (fidCol, Enums.KeyType.Guid); } } /// <summary> /// If no data table name specified, infer primary key columns and types /// Only in data list show /// </summary> /// <param name="dr"></param> /// <param name="mainTable"></param> /// <returns></returns> public static (string KeyName, Enums.KeyType KeyType) Key(this DR dr, string mainTable = null) { (string KeyName, Enums.KeyType KeyType) key = (null, Enums.KeyType.Guid); if (mainTable != null) key = Key(mainTable); if (key.KeyName != null && key.KeyName != "NullKey" && dr.FieldIndex(key.KeyName) >= 0) return key; //other return dr.GetDataTypeName(0) == "bigint" ? (dr.GetName(1), Enums.KeyType.Guid) : (dr.GetName(0), Enums.KeyType.Guid); } /// <summary> /// Primary key value generation rules /// </summary> /// <param name="tableName"></param> /// <returns></returns> public static object KeyGenerate(string tableName) { var key = Key(tableName); if (key.KeyType == Enums.KeyType.SnowId) return Utils.Str.SnowId(); if (key.KeyType == Enums.KeyType.Guid) return str.GetCombID(); return "NullKeyValue"; } /// <summary> /// Preprocessing for obtaining output values of database field types /// </summary> /// <param name="dr"></param> /// <param name="colName"></param> /// <param name="tableName"></param> /// <returns></returns> public static (string val, bool quotation) CommonValue(this DR dr, string colName, string tableName = null, int? colOrdinal = null) { var val = dr.GetValue(colOrdinal ?? dr.GetOrdinal(colName));//IsDBNull? if (val == null) return ("", true); switch (val.GetType().Name.ToLower()) { case "date": return (str.GetDate((DateTime)val), true); case "datetime": return (str.GetDateTime((DateTime)val), true); case "int": case "int32": case "decimal": case "double": case "float": case "single": case "int16": case "int64": case "byte": case "sbyte": case "bool": case "long": case "ulong": case "short": case "ushort": case "uint": return (val.ToString(), false); default: return (val.ToString(), true); } } /// <summary> /// Default fields and value definitions when adding data to the interface /// </summary> /// <param name="tableName"></param> /// <returns></returns> public static Dictionary<string, object> DefaultColsWhenAddForApi(string tableName, Dictionary<string, object> reqDic) { var dic = new Dictionary<string, object>(); tableName = tableName.ToLower(); try { if(tableName.StartsWith("tb_")) { dic.Add("_add_time", str.GetDateTime()); dic.Add("_add_user", User.UserID(reqDic)); dic.Add("_update_time", str.GetDateTime()); dic.Add("_update_user", User.UserID(reqDic)); dic.Add("_available_flag", 1); } else if (tableName.StartsWith("cn_") || tableName.StartsWith("ef_")) { dic.Add("create_time", str.GetDateTime()); dic.Add("create_by", User.UserID(reqDic)); dic.Add("update_time", str.GetDateTime()); dic.Add("update_by", User.UserID(reqDic)); dic.Add("is_delete_flag", 1); } } catch (Exception ex) { log.Error(ex); } return dic; } /// <summary> /// Default fields and value definitions when modifying data through interfaces /// </summary> /// <param name="tableName"></param> /// <returns></returns> public static Dictionary<string, object> DefaultColsWhenModForApi(string tableName, Dictionary<string, object> reqDic) { var dic = new Dictionary<string, object>(); tableName = tableName.ToLower(); try { if (tableName.StartsWith("tb_")) { dic.Add("_update_time", str.GetDateTime()); dic.Add("_update_user", User.UserID(reqDic)); } else if (tableName.StartsWith("cn_") || tableName.StartsWith("ef_")) { dic.Add("update_time", str.GetDateTime()); dic.Add("update_by", User.UserID(reqDic)); } } catch (Exception ex) { log.Error(ex); } return dic; } /// <summary> /// Default fields and value definitions when adding data to a page /// </summary> /// <param name="tableName"></param> /// <returns></returns> public static Dictionary<string, object> DefaultColsWhenAddForPage(string tableName) { return DefaultColsWhenAddForApi(tableName,null); } /// <summary> /// Default fields and value definitions when modifying data on a page /// </summary> /// <param name="tableName"></param> /// <returns></returns> public static Dictionary<string, object> DefaultColsWhenModForPage(string tableName) { return DefaultColsWhenModForApi(tableName, null); } }Define the authorization logic for Api
Define the output structure of Api
xxxxxxxxxxpublic class Api { /// <summary> /// Api authorization /// </summary> /// <param name="businessType">List,DyValue,DataOP</param> /// <param name="path">Api Path</param> /// <param name="paras">Sequence Parameters</param> /// <param name="context">HttpContext</param> /// <param name="reqDic"></param> /// <returns></returns> public static bool Auth(string businessType, string path, string[] paras, HttpContext context, Dictionary<string, object> reqDic = null) { //if (!User.IsLogin()) return false; string key = paras[0]; return true; } public static string AuthFailedJson(string businessType, string path, string[] paras, HttpContext context) { return "{\"code\":401,\"" + MessageStr + "\":\"Authentication failed\"}"; } public static string ExceptionJson(Exception ex) { //return "{\"code\":203,\"" + MessageStr + "\":\"" + NoWrap(ex.Message) + "\"}"; log.Error(ex); return "{\"code\":203,\"" + MessageStr + "\":\"error\"}"; } public static string ErrorJson(string str) { return "{\"code\":203,\"" + MessageStr + "\":\"" + NoWrap(str) + "\"}"; } public static string OperationSuccessJson(string tip = "Operation successful", Dictionary<string, string> AdvKeyValue = null, string NewId = "") { StringBuilder sb = new StringBuilder(); if (AdvKeyValue != null) { foreach (KeyValuePair<string, string> kv in AdvKeyValue) { sb.Append(",\"" + kv.Key + "\":\"" + NoWrap(kv.Value) + "\""); } } string json = "{\"code\":200,\"" + MessageStr + "\":\"success\",\"tip\":\"" + tip + "\",\"data\":{\"newId\":\"" + NewId + "\"" + sb.ToString() + "}}"; sb.Clear(); sb = null; AdvKeyValue.Clear(); AdvKeyValue = null; return json; } public static string OperationBatchSuccessJson(int rowsAffected, string tip = "Operation successful") { return "{\"code\":200,\"" + MessageStr + "\":\"success\",\"tip\":\"" + tip + "\",\"data\":{\"rowsAffected\":" + rowsAffected + "}}"; } public static string ResultJson(string resultJson) { return "{\"code\":200,\"" + MessageStr + "\":\"success\",\"data\":" + resultJson + "}"; } public static string ResultJsonHead() { return "{\"code\":200,\"" + MessageStr + "\":\"success\",\"data\":"; } private static string NoWrap(string s) => s.Replace("\r", "").Replace("\n", ""); public readonly static string MessageStr = "msg"; }
Define methods for obtaining user information

Constructing user login information and returning LoginInfo object
When integrating with third-party systems or frameworks, it is common to parse or call third-party systems through tokens to obtain user objects

Server Implementation of @code configuration
Method of locating the identity to the server through @code configuration
The parameters for @code configuration are entered as string arrays on the server side

Tools, workflows, scheduled tasks, etc.
Access and log in to the server system, enter the account and password (the account and password are defined in the ft_sites table of the server database, default account is user, password 123), click the login button to enter the online document page.

Click on the button column definition to view more columns by dragging and dropping.

The sequence parameters are concatenated after the interface path, separated by /, and currently support a maximum of 12 sequence parameters, corresponding to the @p[n]@ parameter in the client configuration.
For example, the interface path is: http://[url]/api/a?b. If the @p1@ and @p2@ parameter values to be passed are 1 and 2, respectively, the call path should be:
http://[url]/api/a?b/1/2
If some sequence parameters are required, it should be described in the interface description.
Click on the Net or Java link, copy the test address, and then import it in PostMan for direct testing.

The initial message of the input parameter will be automatically filled in without the need for manual input, as shown in the following figure, and can be run directly:

The Data List is used to retrieve multiple rows of data, including sorting, fuzzy search, precise search, custom conditional search, combination search, page turning definition, etc. It also supports data export, batch specific field modification of data (such as soft deletion, status change), and supports mutual calling between interfaces and nested output.
Permissions, display fields and order, interface nesting, data nesting, logical processing, output definition, function calls, and description are all configured and defined on the client side.
Enter parameters through POST, using either Form or Json string format, based on the input column of the interface document.
| parameter | Description | Detail |
|---|---|---|
| orderBy | Sort field | Field name, empty, default by configuration |
| orderType | asc or desc | asc order, desc reverse order, if empty, default by configuration |
| schText | Multi field or fuzzy query by field | 1. According to the configured fuzzy query field, simply input the search text directly, for example, the configured field is a;b. If the input parameter is c, the query SQL will be: and (a like '%c%' or b like '%c%'); 2. According to the fuzzy query configured by the front-end, fields and keywords need to be passed in, such as a: c; b: C, then query SQL as: and (a like ‘%c%’ and b like ‘%c%’); 3. The above parameters have been processed through backend anti SQL injection. |
| schStrict | Define retrieval rules by field | Search by field with logic, input rule is: Col1:Val1;Col2:Val2 ,Col is the field name, Val is the logical definition, and the rules are as follows: 1. null, specify column as null 2. !null, specify column is not null 3. ![txt],specify column as !=’[txt]’ 4. >=[txt],specify column as >=’[txt]’ 5. <=[txt],specify column as <=’[txt]’ 6. >[txt],specify column as >’[txt]’ 7. <[txt],specify column as <’[txt]’ 8. empty,specify column as empty string 9. including %, like query 10. in(a,b,c),specify the value of the column in the set |
| schAdv | Advanced search | Not yet open |
| pageSize | Display quantity per page | If it is 0 or empty, display all data |
| numType | Default No Serial Number 1.Sort by page number 2.Sort by all numbers | |
| pageNum | Which page is displayed, default to first page | If is blank, display the first page |
| keyValue | It is necessary to perform batch data operations | Select/operate on single or multiple records (, separated) according to the set primary key column name |
| (Custom) | Value during batch operation | The mapping relationship between fields and inputs is defined by configuration |
| (Custom) | Value during batch operation | The mapping relationship between fields and inputs is defined by configuration |
| (Custom) | Value during batch operation | The mapping relationship between fields and inputs is defined by configuration |
| isExport | Hidden parameter, if it is 1, export to Excel | When exporting, the search criteria still take effect |
| exportMax | Hidden parameters, maximum number of exported items, unlimited number of exported items if empty or 0 | When exporting, the search criteria still take effect |
| exportName | Hide parameters, define the exported file name, default to Api definition | When exporting, the search criteria still take effect |
Note
When configuring the client, built-in search criteria can be defined, such as permissions, custom conditions, etc. (can be linked with the @p[n]@ parameter)
Referring to the Api documentation, the Json structure is defined by the Project project.
The Data Operation allows for the addition or modification of single or multiple data entries, supporting simultaneous addition and modification of multiple tables, as well as one-time operations on sub tables. The depth of sub tables is not limited, and the client may have already configured data validation rules.
Permissions, input fields, logical processing, transaction processing, backend method calls, and descriptions are all configured and defined on the client side.
Enter parameters through POST, using either Form or Json string format, based on the input column of the interface document. If there is binary data (such as file upload), it is recommended to submit it in Form format.
As a Json object, please refer to the Api documentation for details. just as :

Important
The keys that was not hit during parameter input will be automatically ignored.
For example, if the interface document requires 10 fields to be entered and only 3 fields are matched when called, the server will only process the matching 3 fields.
The advantage of this is that the Api interface can be configured with all fields, and when called, only a few fields that are required for the parameters can be entered according to the actual situation.
Referring to the Api documentation, the Json structure is defined by the Project project.
The Data Getting is used to obtain a single piece of data, mainly used as a detail query. It supports outputting single and multiple table data together, and fields can also output array objects, that is, nested multiple rows of data. It also supports calling interfaces to each other and nested output.
Permissions, display fields and order, interface nesting, data nesting, logical processing, output definition, function calls, and description are all configured and defined on the client side.
GET method input
The input parameters are only sequence parameters.
Referring to the Api documentation, the Json structure is defined by the Project project.
Note
If there is no nested query and no data is found, the value of data is null. When there is a nested query and no data is found in a certain field, the value of that field is FT{NORESULT}.