{{ t('title.' + tab) }}
{{ topbarContext }}
运行摘要
{{ metrics ? Math.floor(metrics.resources.uptime / 60000) + ' ' + t('uptime.minutes') : '-' }}平台服务状态
{{ s.alias }}
{{ s.stopped ? t('stopped') : '运行中' }}
暂无平台服务
{{ t('top.endpoints') }} {{ endpointsExpanded ? 50 : 10 }}
暂无访问数据
{{ t('top.hosts') }} {{ hostsExpanded ? 50 : 10 }}
暂无访问数据
{{ t('top.services') }} {{ servicesExpanded ? 50 : 10 }}
暂无服务访问数据
{{ t('stats.symbolDefault') }}
| 服务 {{ statSortDir==='asc'?'▲':'▼' }} | Symbol {{ statSortDir==='asc'?'▲':'▼' }} | 次数 {{ statSortDir==='asc'?'▲':'▼' }} | 错误 {{ statSortDir==='asc'?'▲':'▼' }} | 最后调用 {{ statSortDir==='asc'?'▲':'▼' }} | 平均耗时 {{ statSortDir==='asc'?'▲':'▼' }} |
|---|---|---|---|---|---|
{{ row.service }} |
{{ row.symbol }} |
{{ row.count }} | {{ row.errors }} | {{ row.lastTime ? new Date(row.lastTime).toLocaleString() : '-' }} | {{ row.avgMs }} ms |
| 暂无调用统计 | |||||
监听器
| 名称 | 协议 | 地址 | 端口 |
|---|---|---|---|
| {{ l.name }} | {{ l.protocol }} | {{ l.host }} | {{ l.port }} |
已注册服务
| 类型 | 别名 | 类 | symbols | 单例 | 指纹 |
|---|---|---|---|---|---|
| {{ s.kind === 'platform' ? '平台' : '应用' }} | {{ s.alias }} | {{ s.class }} | {{ s.methods }} | {{ s.singleton ? '是' : '否' }} | {{ s.fingerprint }} |
平台服务
只读 · 服务端内置平台服务独立于应用服务和虚拟主机,不允许绑定、编辑或删除。
| 别名 | 类 | 状态 | symbols | 调用次数 | 最后调用 | 操作 |
|---|---|---|---|---|---|---|
{{ s.alias }} |
{{ s.class }} | {{ s.stopped ? t('stopped') : '运行中' }} | {{ s.methods }} | {{ statsFor(s.alias).count }} | {{ statsFor(s.alias).lastTime ? new Date(statsFor(s.alias).lastTime).toLocaleString() : '-' }} | |
| 暂无平台服务 | ||||||
插件与扩展
平台服务支持插件贡献服务、生命周期钩子、管理页面、RPC 过滤器和事件订阅。
| ID | 版本 | 状态 | 签名 | 扩展 | 服务 | 操作 |
|---|---|---|---|---|---|---|
{{ p.id }}{{ p.name }} |
{{ p.version }} | {{ p.state }} {{ p.error }} |
{{ p.signature || 'unsigned' }} L{{ p.level }} · {{ (p.permissions || []).join(', ') }} |
{{ (p.extensions || []).length }} | {{ s }} |
打开页面 |
| 暂无插件 | ||||||
应用服务在虚拟主机中进行管理。点击服务列表中的主机名可跳转到对应虚拟主机。
| 启用 | 级别 | 主机 | 可见性 | 别名 | 类 | 来源 | 备注 | symbols | 调用 | 最后调用 | 平均耗时 | 客户端代码 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ s.enable ? '是' : '否' }} | {{ s.level }} {{ t('stopped') }} | {{ s.hosts.join(', ') }}全部 |
{{ visibilityLabel(s) }} | {{ s.alias }} |
{{ s.class }} | {{ s.source || 'config' }} {{ s.deploymentId }} | {{ s.note || '-' }} | {{ s.methods }} | {{ statsFor(s.alias).count }} | {{ statsFor(s.alias).lastTime ? new Date(statsFor(s.alias).lastTime).toLocaleString() : '-' }} | {{ statsFor(s.alias).avgMs }} ms |
添加全局目录
| 启用 | 级别 | 前缀 | 目录 | 备注 | SPA | 列表 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ s.enable ? '是' : '否' }} | {{ s.level }} | {{ s.prefix }} |
{{ s.dir }} | {{ s.note || '-' }} | {{ s.spa ? '是' : '否' }} | {{ s.list ? '是' : '否' }} |
全局库
所有虚拟主机共享的 JAR。上传后对 Java 编译立即生效;点击“重载动态服务”或“重载”WAR 可让运行中的应用使用新库。
| JAR | 大小 | 时间 | 操作 |
|---|---|---|---|
{{ lib.name }} |
{{ (lib.size / 1024).toFixed(1) }} KB | {{ new Date(lib.time).toLocaleString() }} | |
| 暂无全局库 | |||
添加虚拟主机
| 级别 | Hosts | 目录 | 备注 | SPA | 启用 | 调用统计 | 更多操作 |
|---|---|---|---|---|---|---|---|
| {{ v.level }} |
{{ host }},
|
{{ v.root }} | {{ v.note || '-' }} | {{ v.spa ? '是' : '否' }} | {{ v.enable ? '启用' : '停用' }} |
| 时间 | 方法 | 状态 | Host | URI | 客户端 | 耗时 | 大小 |
|---|---|---|---|---|---|---|---|
| {{ new Date(row.time).toLocaleString() }} | {{ row.method }} |
{{ row.status }} | {{ row.host }} | {{ row.uri }} |
{{ row.client }} | {{ row.durationMs }} ms | {{ formatBytes(row.bytes) }} |
| 暂无访问日志 | |||||||
| 时间 | 状态 | Host | URI | 错误 | |
|---|---|---|---|---|---|
| {{ new Date(row.time).toLocaleString() }} | {{ row.status }} | {{ row.host }} | {{ row.uri }} |
||
| 暂无错误日志 | |||||
| 时间 | 用户 | 动作 | 目标 | 详情 |
|---|---|---|---|---|
| {{ new Date(row.time).toLocaleString() }} | {{ row.username }} |
{{ row.action }} | {{ row.target }} | |
| 暂无审计日志 | ||||
{{ vhostLogLines.length ? vhostLogLines.join('\n') : '暂无应用日志' }}
错误堆栈
{{ selectedError.method }} {{ selectedError.uri }} · {{ selectedError.host }}
{{ selectedError.stack || selectedError.message }}
新增 / 修改用户
密码至少 10 位,且包含大写、小写、数字和符号;连续失败 5 次锁定 15 分钟。
| 启用 | 用户名 | 角色 | 手机号 | 邮箱 | 2FA | 密码 | 操作 |
|---|---|---|---|---|---|---|---|
| {{ u.enabled ? '是' : '否' }} | {{ u.username }} |
{{ roleLabel(u.roles) }} | {{ u.phone || '-' }} | {{ u.email || '-' }} | {{ u.totpBound ? '已绑定' : '未绑定' }} | {{ u.passwordExpired ? '已过期' : '正常' }} |
CSMAKE Server {{ about ? about.version : '' }}
{{ t('company.name') }}
服务器信息
| 产品 | {{ about.product }} |
|---|---|
| 公司 | {{ lang==='en' ? about.companyEn : about.company }} |
| Java | {{ about.javaVersion }} · {{ about.javaVendor }} |
| 操作系统 | {{ about.os }} |
| 工作目录 | {{ about.userDir }} |
| 进程 PID | {{ about.pid }} |
| 启动时间 | {{ new Date(about.startTime).toLocaleString() }} |
| 数据库 | {{ about.database }} |
| 服务 Context | {{ about.context }} |
| 管理路径 | {{ about.adminPath }} |
{{ t('approval.title') }}
{{ t('approval.hint') }}
| {{ t('approval.time') }} | {{ t('approval.action') }} | 摘要 | {{ t('approval.requester') }} | {{ t('approval.status') }} | {{ t('approval.approver') }} | {{ t('approval.remark') }} | {{ t('approval.actions') }} |
|---|---|---|---|---|---|---|---|
| {{ new Date(a.created).toLocaleString() }} | {{ a.action }} |
{{ a.summary }} | {{ a.requester }} | {{ a.status }} | {{ a.approver || '-' }} | {{ a.note || '-' }} | - |
| {{ t('approval.empty') }} | |||||||
审批详情 · {{ approvalDetailTarget.action }}
{{ approvalDetailTarget.requester }} · {{ approvalDetailTarget.status }}
{{ approvalDetailTarget.prettyPayload }}
开发与运维文档
Markdown 文档,可直接下载或在线阅读。
编辑全局目录
服务详情 · {{ serviceDetailTarget.alias }}
{{ (serviceDetailTarget.runtime || {}).instanceId || '-' }}{{ (serviceDetailTarget.runtime || {}).classLoader || '-' }}服务绑定
| Host | Context | 级别 | 启用 |
|---|---|---|---|
{{ b.host }} |
{{ b.contextPath }} |
{{ b.level }} | {{ b.enabled ? '是' : '否' }} |
| 未显式绑定,按全局服务处理 | |||
编辑服务 · {{ serviceEditTarget.alias }}
服务绑定
| Host | Context | 级别 | 启用 | |
|---|---|---|---|---|
Host 使用 * 表示全局绑定;平台服务不需要绑定。
编辑虚拟主机
修改 Hosts 会影响访问域名;保存后立即生效。
Nginx Location · {{ locationTarget.hosts.join(', ') }}
可粘贴 Nginx location 配置,点击“解析 Nginx”转为 JSON;保存时会校验 proxyPass 主机是否在 security.proxyAllowHosts 中,未授权将拒绝保存;保存后立即重新加载 Location,无需重启服务。
当前 JSON(可直接编辑):
{{ docTarget.name }}
开发部署令牌
供 VS Code、NetBeans 和本地开发工具调用 /csmake-app/dev/* 接口。令牌只应保存在开发机。
令牌文件:{{ devTokenForm.path || 'work/dev-token' }}
修改后立即生效;同时写入 work/dev-token 和 work/dev-enabled,重启后保持。
系统导出 / 导入还原
导出虚拟主机、全局目录、服务、部署记录和当前配置快照。导入只恢复管理数据,监听端口、TLS 等启动级配置仍需重启并手工确认。
安全策略
安全与访问
路径配置
应用 Context 用于 RPC、健康检查和客户端接口;管理路径用于 Studio。修改后需重启服务端,并在访问时使用新路径。
调试模式
当前运行状态:{{ debugModeForm.active ? '已启用 JDWP' : '未启用 JDWP' }} · {{ debugModeForm.restartRequired ? '需要重启后生效' : '与配置一致' }}
调试模式只监听 127.0.0.1,修改后需要重启服务器。
JDK/JRE 路径
当前运行 JDK/JRE:{{ jdkForm.current || '-' }} · {{ jdkForm.version || '-' }} · {{ jdkForm.valid ? '路径有效' : '路径无效' }} · {{ jdkForm.compiler ? '可编译' : '仅运行(无 javac)' }} · {{ jdkForm.restartRequired ? '重启后生效' : '与当前一致' }}
重启服务器时由 start.cmd 使用该 JDK/JRE;留空表示使用系统默认 java。
日志与审计
日志滚动、stdout/stderr 捕获在重启 csmake-server 后生效。
告警
告警配置在重启后完全生效。
文件与上传
代码生成
客户端文档地址按当前访问的协议、主机和 Context 自动生成,无需配置固定基础 URL。
SMTP 邮件设置
用于密码重置、验证码和系统通知。密码留空表示保持原值。
当前配置(密码已脱敏)
{{ config.configText }}
监听端口、TLS 等启动级配置修改后需要重启进程;服务、全局目录、虚拟主机支持在线生效。
{{ t('deploy.title') }} · {{ deployTarget.hosts.join(', ') }}
{{ t('deploy.subtitle') }}
{{ t('deploy.hint') }}
{{ f.name }}
WAR:{{ deployCompatReport.warName || '-' }}
· Context:{{ deployCompatReport.contextPath || '-' }}
context.xml path:{{ deployCompatReport.contextXmlPath }}
· sessionCookiePath:{{ deployCompatReport.contextXmlSessionCookiePath }}
{{ deployCompatReport.recommendation }}
已移除容器 API:{{ deployCompatReport.removed.join('、') }}
已复制到 WAR/WEB-INF/lib:{{ deployCompatReport.provided.join('、') }}
{{ warning }}
{{ deployTarget.hosts.join(', ') }} {{ t('deploy.items') }}
| 启用 | 类型 | 状态 | 名称 | Context/前缀 | 备注 | 批次 | 路径 | 时间 | 发布服务 | 操作 |
|---|---|---|---|---|---|---|---|---|---|---|
| - | {{ d.kind }} | {{ d.available === false ? (lang === 'en' ? 'Unavailable' : '不可用') : (lang === 'en' ? 'Running' : '运行中') }} - | {{ d.name }} |
{{ d.prefix }}
-
|
{{ d.note || '-' }} | {{ d.batchId || '-' }} |
{{ d.path }} |
{{ new Date(d.time).toLocaleString() }} | - | |
| 暂无部署项 | ||||||||||
{{ artifactTarget.name }}
{{ artifactTarget.kind }} · {{ artifactTarget.path }}
没有匹配的文件或类
发布服务 · {{ artifactForm.class }}
点击列表中的 .class 文件,可选择别名并发布为服务。
CSMake Java Web Studio Java Studio
{{ warJavaTitle() }} · {{ warJavaClass }}
{{ warJavaActive || '未选择文件' }}
{{ warJavaResult }}
{{ warJavaError }}
{{ warJavaPrompt.title }}
从 WAR 发布 CSMake 服务 · {{ warServiceTarget.prefix }}
class 必须存在于该 WAR 的 WEB-INF/classes 或 WEB-INF/lib。
在该虚拟主机注册服务
绑定到该虚拟主机的服务
| 启用 | 级别 | 别名 | 类型 | 类 | hosts | 可见性 | 备注 | 调用统计 | 操作 |
|---|---|---|---|---|---|---|---|---|---|
| {{ s.enable ? '是' : '否' }} | {{ s.level }} | {{ servicePlatformType(s) }} | {{ s.alias }} |
{{ s.class }} | {{ (s.hosts || []).join(', ') }} |
{{ visibilityLabel(s) }} | {{ s.note || '-' }} | {{ statsFor(s.alias).count }} | 平台服务 |
| 没有绑定到该虚拟主机的服务 | |||||||||
Symbol 调用统计 · {{ statsServiceTarget.alias }}
{{ statsServiceTarget.class }}
| Symbol | 次数 | 错误 | 最后调用 | 平均耗时 |
|---|---|---|---|---|
{{ row.symbol }} |
{{ row.count }} | {{ row.errors }} | {{ row.lastTime ? new Date(row.lastTime).toLocaleString() : '-' }} | {{ row.avgMs }} ms |
| 该服务暂无调用统计 | ||||
{{ t('stats.symbolDefault') }}
虚拟主机:{{ (vhostStatsTarget.hosts || []).join(', ') }}
| 服务 | Symbol | 次数 | 错误 | 最后调用 | 平均耗时 |
|---|---|---|---|---|---|
{{ row.service }} |
{{ row.symbol }} |
{{ row.count }} | {{ row.errors }} | {{ row.lastTime ? new Date(row.lastTime).toLocaleString() : '-' }} | {{ row.avgMs }} ms |
| 该虚拟主机暂无调用统计 | |||||
{{ t('file.edit') }} · {{ fileTarget.title }}
{{ result.path }}:{{ result.line }}
{{ result.snippet }}
{{ t('file.empty') }}
{{ filePath || t('file.selectLeft') }}
{{ lineNumbers(fileContent) }}{{ t('file.history') }}
{{ t('java.title') }} · {{ (deployTarget.hosts || []).join(', ') }}
{{ t('file.history') }}
{{ javaCompileResult }}
{{ javaCompileError }}
{{ t('invoke.title') }} · {{ invokeTarget.alias }}
{{ invokeTarget.class }} · {{ (invokeTarget.hosts || []).join(', ') }}
{{ sym.signature }}
{{ sym.comment }}
暂无可用 Symbol
{{ invokeResult }}
{{ t('invoke.generating') }} {{ invokeTab }}...
密码已过期
密码已超过 90 天,必须修改后才能继续运维操作。
{{ confirmDialog.title }}
选择 JDK/JRE 目录
选择包含 bin/java 的目录(JRE 或 JDK 均可)
当前目录下没有子目录