xwiki livedata自定义数据源

62 阅读1分钟

xwiki livedata自定义数据源

前文中我们自定义页面,让livedata去加载自动定义页面,只不过页面是静态数据,下面将静态数据替换为从数据库读取,实现实时数据展示。

{{groovy}}
import groovy.json.JsonOutput
import groovy.sql.Sql
import org.slf4j.Logger
import java.net.URLDecoder

def logger = services.logging.getLogger("LiveTableScript")

if (request?.getParameter("xpage") == "plain") {
    response.setContentType("application/json; charset=UTF-8")
}

// ==== 数据库加载 ====
def all = []
try {
    def sql = Sql.newInstance('jdbc:postgresql://ip:5432/dbname', '用户名', '密码', 'org.postgresql.Driver')
    def rows = sql.rows("SELECT addvcd, addvnm, level_number FROM sys_addvcd")
    all = rows.collect { row ->
        [
            id: row.addvcd as String, // Map addvcd to id
            name: row.addvnm as String, // Map addvnm to name
            level: row.level_number as Integer, // Map level_number to level
            parentId: "0" // Default parentId, as not provided in DB schema
        ]
    }
    sql.close()
} catch (Exception e) {
    logger.error("Database error: {}", e.message)
    all = []
}

// ==== 参数处理 ====
def rawOffset = (request?.getParameter("offset") ?: "1") as int
def offset = rawOffset > 0 ? rawOffset - 1 : 0
def limit = (request?.getParameter("limit") ?: "15") as int
def sortField = request?.getParameter("sort") ?: "id"
def dir = request?.getParameter("descending") == "true" ? "desc" : "asc"
def rawSearch = request?.getParameter("filters.name") ?:
                request?.getParameter("filter.name") ?:
                request?.getParameter("name")
def searchName = rawSearch ? URLDecoder.decode(rawSearch.replaceFirst(/^contains:/, '').trim(), "UTF-8") : null

logger.debug("Request URL: {}", request?.requestURL)
logger.debug("Request parameters: {}", request?.parameterMap)
logger.debug("Raw offset parameter: {}", rawOffset)
logger.debug("Converted offset (0-based): {}", offset)
logger.debug("Limit: {}", limit)
logger.debug("Raw search parameter: {}", rawSearch)
logger.debug("Decoded search value: {}", searchName)
logger.debug("Sort field: {}", sortField)
logger.debug("Sort direction: {}", dir)

// ==== 过滤 ====
def filtered = all
if (searchName) {
    filtered = all.findAll { record ->
        def normalizedName = record.name.trim()
        normalizedName.contains(searchName)
    }
    logger.debug("Filtered results: {}", filtered)
}

// ==== 排序 ====
if (filtered) {
    filtered = filtered.sort { a, b ->
        def valA = a[sortField] ?: (sortField == "name" ? "" : 0)
        def valB = b[sortField] ?: (sortField == "name" ? "" : 0)
        dir == "desc" ? -(valA <=> valB) : (valA <=> valB)
    }
}

// ==== 分页 ====
def totalCount = filtered.size() ?: 0
def entries = filtered.drop(offset).take(limit)

logger.debug("Paginated entries: {}", entries)

// ==== 输出 ====
def result = [
    totalrows   : totalCount,
    returnedrows: entries.size(),
    offset      : rawOffset,  
    reqNo       : (request?.getParameter("reqNo") ?: "1") as int,
    rows        : entries.collect { entry ->
        [
            id         : entry.id,
            name       : entry.name,
            level      : entry.level,
            parentId   : entry.parentId,
            doc_viewable: true
        ]
    }
]

print JsonOutput.toJson(result)
{{/groovy}}

在这里插入图片描述

在这里插入图片描述