189 lines
5.6 KiB
Lua
189 lines
5.6 KiB
Lua
local M = {}
|
||
|
||
|
||
M.file_get_contents = function(filepath)
|
||
|
||
local file, errmsg = io.open(fw.website_dir()..filepath, "r")
|
||
if not file then
|
||
fw.throw_string(errmsg)
|
||
end
|
||
local content = file:read("*a")
|
||
if content == nil or content == "" then
|
||
print("file_get_contents error: ",filepath)
|
||
return ""
|
||
end
|
||
local replaced,c2 = engine.replace(content)
|
||
if replaced then
|
||
return c2
|
||
end
|
||
return content
|
||
end
|
||
M.menu_top = function()
|
||
-- 当前请求路径
|
||
local request_path = request.filepath() or ""
|
||
-- 取配置
|
||
local menuData = require("fwutils.develop.function.menu").bytecode(string.format("%d",engine.cfg.role_id()))
|
||
if not menuData then
|
||
return "<!-- no menu config -->"
|
||
end
|
||
|
||
-- 提取并排序主菜单
|
||
local menuItems = {}
|
||
for name, item in pairs(menuData) do
|
||
table.insert(menuItems, {
|
||
name = name,
|
||
item = item,
|
||
sort = item.sort or 0
|
||
})
|
||
end
|
||
table.sort(menuItems, function(a, b)
|
||
return a.sort > b.sort
|
||
end)
|
||
|
||
local html = [[
|
||
|
||
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
|
||
]]
|
||
|
||
-- 渲染主菜单
|
||
for _, entry in ipairs(menuItems) do
|
||
local name = entry.name
|
||
local item = entry.item
|
||
local icon = item.icon or ""
|
||
local path = item.path or "#"
|
||
local activeClass = ""
|
||
|
||
if item.children then
|
||
-- 有子菜单
|
||
local isMegamenu = item.megamenu and " dropdown-megamenu" or ""
|
||
|
||
-- 检查子菜单是否有激活
|
||
local hasActiveChild = false
|
||
local children = {}
|
||
for childName, childItem in pairs(item.children) do
|
||
table.insert(children, {
|
||
name = childName,
|
||
item = childItem,
|
||
sort = childItem.sort or 0
|
||
})
|
||
if not hasActiveChild and (request_path == (childItem.path or "")) then
|
||
hasActiveChild = true
|
||
end
|
||
end
|
||
table.sort(children, function(a, b)
|
||
return a.sort > b.sort
|
||
end)
|
||
|
||
-- 父菜单激活:当前页面是父菜单path,或是任一子菜单path
|
||
if request_path == path or hasActiveChild then
|
||
activeClass = "active-link"
|
||
end
|
||
|
||
html = html .. [[
|
||
<li class="nav-item dropdown ]] .. activeClass .. [[">
|
||
<a class="nav-link dropdown-toggle" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||
<i class="]] .. icon .. [["></i> ]] .. name .. [[
|
||
</a>
|
||
<ul class="dropdown-menu]] .. isMegamenu .. [[">
|
||
]]
|
||
|
||
-- 渲染子菜单
|
||
for _, child in ipairs(children) do
|
||
local childName = child.name
|
||
local childItem = child.item
|
||
local childPath = childItem.path or "#"
|
||
|
||
-- 子菜单不设置激活样式
|
||
html = html .. [[
|
||
<li>
|
||
<a class="dropdown-item" href="]] .. childPath .. [[">
|
||
<span>]] .. childName .. [[</span>
|
||
</a>
|
||
</li>
|
||
]]
|
||
end
|
||
|
||
html = html .. [[
|
||
</ul>
|
||
</li>
|
||
]]
|
||
else
|
||
-- 没有子菜单
|
||
-- 简单的“当前页面是否激活”检查
|
||
if request_path == path then
|
||
activeClass = "active-link"
|
||
end
|
||
html = html .. [[
|
||
<li class="nav-item ]] .. activeClass .. [[">
|
||
<a class="nav-link" href="]] .. path .. [[">
|
||
<i class="]] .. icon .. [["></i> ]] .. name .. [[
|
||
</a>
|
||
</li>
|
||
]]
|
||
end
|
||
end
|
||
|
||
html = html .. [[
|
||
</ul>
|
||
]]
|
||
|
||
return [=[
|
||
<nav class="navbar navbar-expand-lg">
|
||
<div class="container">
|
||
<div class="offcanvas offcanvas-end" id="MobileMenu">
|
||
<div class="offcanvas-header">
|
||
<h5 class="offcanvas-title semibold">Navigation</h5>
|
||
<button type="button" class="btn btn-danger btn-sm ms-auto" data-bs-dismiss="offcanvas">
|
||
<i class="icon-clear"></i>
|
||
</button>
|
||
</div>
|
||
]=]..html..[[
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
]]
|
||
end
|
||
M.teacher_photos = function()
|
||
require("app.app")
|
||
local conn = db_conn()
|
||
local edu_id = edu_id()
|
||
local edu_teacher = require("app.function.edu_teacher")
|
||
local edu_setting = require("app.function.edu_setting")
|
||
local teacher_info = edu_teacher.get_by_id(pint("id"),edu_id,conn)
|
||
if teacher_info == nil then
|
||
conn:close()
|
||
return ""
|
||
end
|
||
local domain_assets_cn = edu_setting.get_assets_domain_cn(edu_id,conn)
|
||
local photos = {}
|
||
if teacher_info.photo and type(teacher_info.photo) == "string" and teacher_info.photo ~= "" then
|
||
local ok, decoded = pcall(function() return cjson.decode(teacher_info.photo) end)
|
||
if ok and type(decoded) == "table" then
|
||
photos = decoded
|
||
end
|
||
end
|
||
local content = "<div><div class='home-img'><img src='"..domain_assets_cn.."/".. teacher_info.avatar.."' class='img-fluid bg-img' alt=''></div></div>"
|
||
for i,v in ipairs(photos) do
|
||
if type(v) == "string" then
|
||
content = content..[[<div>
|
||
<div class="home-img">
|
||
<img src="]]..domain_assets_cn.."/"..v..[[" class="img-fluid bg-img" alt="">
|
||
</div>
|
||
</div>
|
||
]]
|
||
end
|
||
end
|
||
conn:close()
|
||
return content
|
||
-- return "<h1>卧槽</h1>"
|
||
end
|
||
M.regist = function(env)
|
||
for key, value in pairs(M) do
|
||
if type(value) == "function" and key ~= "functions" and key ~= "get_all_functions" then
|
||
env[key] = value
|
||
end
|
||
end
|
||
return env
|
||
end
|
||
return M
|