```
---
## ciybigscreen.js API 详解
### 类:`ciyclass.bigpanel`
**功能**:大屏面板管理核心类
#### 构造函数参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `name` | String | ✓ | - | 面板唯一标识(用于DOM的id) |
| `jspath` | String | ✓ | - | 组件JS文件路径(如 `'./b64/'`) |
| `style` | String | - | `''` | 面板容器内联样式 |
| `prop` | String | - | `''` | 面板容器HTML属性 |
| `animation` | String | - | - | 动画类型('ani1', 'ani2', 'small') |
| `mask` | String | - | - | 遮罩层颜色(如 `'rgba(0,0,0,0.5)'`) |
**使用示例**:
```javascript
var chtpls = {};
chtpls['bank1'] = new ciyclass.bigpanel({
name: 'panel_bank1', // 必填
jspath: './b64/', // 必填
style: 'position:absolute;top:4em;left:5px;right:5px;bottom:20px;',
animation: 'ani1',
mask: 'rgba(0,0,0,0.5)'
});
```
#### 实例属性
| 属性 | 类型 | 说明 |
|------|------|------|
| `this.container` | jQuery对象 | 面板容器DOM对象 |
| `this.post` | Object | 传递给后端的公共参数(每个组件独有) |
**使用示例**:
```javascript
chtpls['bank1'].post = {
bankid: 123,
orgid: 1
};
```
#### 方法详解
**1. `addplot(opn)` - 添加图表组件**
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `opn.jsname` | String | ✓ | 组件名称(如 `'bank1_c1'`) |
| `opn.style` | String | - | 组件容器样式 |
| `opn.prop` | String | - | 组件容器HTML属性 |
**使用示例**:
```javascript
chtpls['bank1'].addplot({
jsname: 'bank1_c1',
style: 'position:absolute;left:0;top:0;width:33%;height:33%;',
prop: 'data-id="chart1"'
});
```
**内部流程**:
```
1. 创建组件加载状态:plots[opn.jsname] = { load: 0 }
2. 动态加载JS文件:ciyfn.loadjs('ciy_chart_' + opn.jsname, ...)
3. 加载成功后创建容器:load = 1
4. 添加到面板容器:load = 2
5. 实例化组件类:new window['ciy_chart_' + opn.jsname]()
```
**2. `setbtns(opn)` - 设置按钮**
**参数**:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `opn.template` | String | - | - | 模板类型(如 `'close1'`) |
| `opn.html` | String | - | `''` | 自定义按钮HTML |
| `opn.hideopacity` | Number | - | `0.9` | 隐藏时透明度(0-1) |
| `opn.hidesec` | Number | - | `5` | 鼠标静止X秒后隐藏 |
| `opn.top` | String | - | `'2px'` | 按钮顶部位置 |
| `opn.click` | Function | - | - | 自定义点击事件 |
**使用示例**:
```javascript
// 使用内置模板
chtpls['bank1'].setbtns({
template: 'close1',
hideopacity: 0.9,
hidesec: 5,
top: '2px'
});
// 自定义按钮
chtpls['bank1'].setbtns({
html: '
',
click: function(e) {
console.log('按钮被点击');
}
});
```
**内置模板**:
- `close1` - 关闭按钮(右上角×)
**自动隐藏机制**:
- 监听 `mousemove` 事件更新时间戳
- 每500ms检查是否超过 `hidesec` 秒未操作
- 超时则降低透明度到 `hideopacity`
**3. `run(fsec)` - 启动数据轮询**
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `fsec` | Object | ✓ | 刷新频率配置(键为接口名,值为0.5秒的倍数) |
**使用示例**:
```javascript
chtpls['bank1'].run({
'bank_c1': 50, // 每25秒刷新一次(50 × 0.5秒)
'bank_c2': 10, // 每5秒刷新一次(10 × 0.5秒)
'bplant': 50 // 每25秒刷新一次
});
```
**内部流程**:
```
初始化阶段(仅执行一次)
└─ 遍历所有组件
└─ 读取组件的 this.func 数组
└─ 为每个接口创建 funcsecs 对象
└─ 设置初始倒计时 t=0 和最大间隔 max
轮询阶段(每500ms执行一次)
└─ 遍历 funcsecs
├─ t == 0?发起请求
│ ├─ 合并参数:Glob.post + thos.post
│ ├─ 调用 ciyfn.callfunc(ifu, post, callback)
│ ├─ 成功:
│ │ ├─ 重置倒计时:t = max
│ │ └─ 分发数据到所有相关组件
│ └─ 失败:t = 5(5秒后重试)
└─ t--(倒计时递减)
```
**数据分发逻辑**:
```javascript
// 遍历所有组件
for (var iplot in plots) {
// 检查组件是否匹配(通过 prefunc)
if (plots[iplot].clss.prefunc != funcsecs[ifu].prefunc) continue;
// 提取函数名(去掉前缀)
var funcstr = ifu.substring(funcsecs[ifu].prefunc.length);
// 检查组件是否需要此数据
if (plots[iplot].clss.func.indexOf(funcstr) == -1) continue;
// 调用组件的 setdata 方法
if (typeof (plots[iplot].clss.setdata) == 'function') {
plots[iplot].clss.setdata(funcstr, jsondata);
}
}
```
**4. `setdata()` - 手动刷新所有组件**
**参数**:无
**功能**:临时方法,用于调试或手动触发刷新
**使用示例**:
```javascript
chtpls['bank1'].setdata();
```
**5. `resize()` - 窗口大小改变响应**
**参数**:无
**功能**:遍历所有组件,调用其 `resize()` 方法
**使用示例**:
```javascript
window.addEventListener("resize", function () {
ciyfn.big_setbetsize(1536);
for (var ipl in chtpls) {
chtpls[ipl].resize();
}
});
```
**6. `distory()` - 销毁面板**
**参数**:无
**功能**:清理面板资源,包括定时器、组件、DOM元素
**清理流程**:
```
1. 清除定时器:tick, tick_btns
2. 遍历所有组件
└─ 调用组件的 distory() 方法
└─ 删除组件对象
3. 播放关闭动画(如果设置了 animation)
4. 移除DOM元素
```
**使用示例**:
```javascript
chtpls['bank1'].distory();
delete chtpls['bank1'];
```
---
### 工具函数:`ciyfn.big_setbetsize(basewidth, fontsize)`
**功能**:设置大屏缩放比例和字体大小
**参数**:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `basewidth` | Number | ✓ | - | 基准设计宽度(如 1536) |
| `fontsize` | Number/String | - | `'auto'` | 字体大小('auto' 或 具体数值) |
**返回值**:无
**使用示例**:
```javascript
ciyfn.big_setbetsize(1536); // 自动计算
ciyfn.big_setbetsize(1536, 16); // 指定字体大小
ciyfn.big_setbetsize(1536, 0); // 不调整字体
```
**计算逻辑**:
```
1. 获取屏幕宽度:window.screen.width
2. 开发模式特殊处理(urlp.dev)
└─ devicePixelRatio < 0.8 时放大屏幕宽度
3. 屏幕宽度 > 基准宽度?
└─ 是:计算缩放比例 bet = screenwidth / basewidth
└─ 是:计算字体 fontsize = 14 * bet
4. 设置全局样式
└─ $5('body').css('fontSize', fontsize)
5. 更新全局变量
└─ Glob.fontsize = fontsize - 2
└─ Glob.bet = bet
```
**使用场景**:
```javascript
// 页面加载时
ciyfn.big_resolution(1536, 864);
ciyfn.big_setbetsize(1536);
// 窗口大小改变时
window.addEventListener("resize", function () {
ciyfn.big_setbetsize(1536);
for (var ipl in chtpls) {
chtpls[ipl].resize();
}
});
```
---
### 工具函数:`ciyfn.big_resolution(width, height)`
**功能**:检查屏幕分辨率是否匹配建议值
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `width` | Number | ✓ | 基准宽度 |
| `height` | Number | ✓ | 基准高度 |
**返回值**:无
**使用示例**:
```javascript
ciyfn.big_resolution(1536, 864);
```
**检查流程**:
```
1. 检查物理分辨率:window.screen.width/height
└─ 不匹配?提示:"最佳分辨率为:1536 x 864"
2. 检查窗口宽度:window.innerWidth
└─ 不等于基准宽度?返回(判断为调试模式)
3. 检查窗口高度:window.innerHeight
└─ 小于基准高度?提示:"请按F11,进入全屏模式"
```
**使用场景**:
```javascript
// 页面加载时检查
ciyfn.big_resolution(1536, 864);
```
---
### 类:`ciyclass.bigcychange`
**功能**:值循环切换工具(用于图片轮播、数据切换等)
#### 构造函数参数
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|--------|------|
| `values` | Array | ✓ | - | 值数组 |
| `changecb` | Function | ✓ | - | 值改变时的回调函数 |
| `cycsec` | Number | - | `5` | 切换间隔(秒) |
**使用示例**:
```javascript
var cyc = new ciyclass.bigcychange({
values: ['img1.jpg', 'img2.jpg', 'img3.jpg'],
cycsec: 5,
changecb: function (img) {
$5('img', opdata.container).attr('src', img);
}
});
```
#### 实例属性
| 属性 | 类型 | 说明 |
|------|------|------|
| `this.value` | Any | 当前值 |
#### 方法详解
**1. `change(mm, longsec)` - 手动切换到指定值**
**参数**:
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| `mm` | Any | ✓ | 要切换到的值 |
| `longsec` | Number | - | 停留时长(秒),默认使用 cycsec |
**返回值**:Boolean(成功返回 true,失败返回 false)
**使用示例**:
```javascript
cyc.change('img2.jpg', 10); // 切换到'img2.jpg',停留10秒
cyc.change('img1.jpg'); // 切换到'img1.jpg',使用默认间隔
```
**2. `distory()` - 销毁定时器**
**参数**:无
**返回值**:无
**使用示例**:
```javascript
cyc.distory();
```
**完整使用示例**:
```javascript
function ciy_chart_farm_l3(opdata) {
this.func = ['farm_l3'];
var thos = this;
var cyc = null;
this.setdata = function (funame, data) {
var imgs = data.farm.picszz.split('~');
cyc = new ciyclass.bigcychange({
values: imgs,
cycsec: 5,
changecb: function (img) {
$5('img', opdata.container).attr('src', img);
}
});
}
this.distory = function () {
if (cyc) cyc.distory();
}
opdata.container.append('
![]()
');
}
```
---
### 全局变量:`Glob`
| 属性 | 类型 | 说明 |
|------|------|------|
| `Glob.post` | Object | 传递给后端的公共参数(所有面板共享) |
| `Glob.bet` | Number | 屏幕缩放比例 |
| `Glob.fontsize` | Number | 字体大小 |
| `Glob.myparam` | Object | 自定义参数 |
**使用示例**:
```javascript
// 页面加载时设置公共参数
ciyfn.callfunc('init', {}, function (json) {
Glob.post.orgid = json.orgid;
Glob.myparam = { title: json.title };
});
// 组件内使用
var option = {
fontSize: 18 * Glob.bet,
borderRadius: 4 * Glob.bet
};
```
---
## 样式命名规范与最佳实践
### CSS命名规范
为避免样式冲突,组件内部CSS应遵循以下规范:
#### BEM命名法
```css
/* 面板_组件__元素 */
.bank1-c1__num { }
.bank1-c1__title { }
.farm1-l2__info { }
.farm1-l2__item { }
```
**示例**:
```javascript
opdata.container.append(`
`);
// 动态注入样式
var style = document.createElement("style");
style.innerHTML = `
.bank1-c1__num {
font-size: 1.8em;
font-weight: bold;
color: #ffffff;
}
.bank1-c1__title {
font-size: 0.8em;
color: #6dcdee;
}
`;
window.document.head.appendChild(style);
```
#### ID选择器(配合 opdata.container)
```javascript
// 添加元素时指定ID
opdata.container.append('
');
// 访问时限定在容器内
var chart1 = echarts.init($5('#chart1', opdata.container)[0], 'dark');
```
#### data-* 属性选择器
```javascript
// 添加元素
opdata.container.append(`
--
银行名称
`);
// 更新数据
$5('[data-num="n1"]', opdata.container).text(data.n1);
$5('[data-bank]', opdata.container).text(data.name);
```
### 使用 bigscreen 资源
#### 字体选择
```css
/* 大屏主标题 */
font-family: fnt01;
font-size: 2em;
letter-spacing: 0.2em;
/* 中等标题 */
font-family: fnt02;
font-size: 1.5em;
/* 数字展示 */
font-family: eng02;
font-size: 1.8em;
letter-spacing: 4px;
```
#### 边框选择
```javascript
// 添加边框容器
opdata.container.append(`
`);
// 或在HTML中定义
var chartHTML = `
`;
opdata.container.append(chartHTML);
```
#### 标题选择
```javascript
// 面板内部小标题
var titleHTML = `
`;
opdata.container.append(titleHTML);
```
### 渐变文字效果
```javascript
// 标题渐变
var captionHTML = `
大屏标题
`;
opdata.container.append(captionHTML);
```
### 使用全局缩放比例
```javascript
// 在所有尺寸计算中使用 Glob.bet
var option = {
textStyle: {
fontSize: Glob.fontsize
},
series: [{
itemStyle: {
borderRadius: 4 * Glob.bet,
borderWidth: 1 * Glob.bet
},
label: {
fontSize: 18 * Glob.bet,
padding: [18 * Glob.bet, 0, 8 * Glob.bet, 0]
},
labelLine: {
length: 20 * Glob.bet,
length2: 80 * Glob.bet
}
}]
};
// CSS样式
var style = document.createElement("style");
style.innerHTML = `
.bank1-c1__num {
font-size: 1.8em;
padding: 10px * ${Glob.bet};
}
`;
```
### 动画效果
```javascript
// 透明度动画
@keyframes opa {
0% { opacity: 1; }
10% { opacity: 0.5; }
20% { opacity: 1; }
}
.ani-fade {
animation: opa 5s infinite;
}
// ECharts自动高亮动画
var idx_autohight = -1;
var t_autohight = setInterval(function () {
var option = chart1.getOption();
chart1.dispatchAction({
type: 'downplay',
dataIndex: idx_autohight
});
idx_autohight = (idx_autohight + 1) % option.series[0].data.length;
chart1.dispatchAction({
type: 'highlight',
dataIndex: idx_autohight
});
}, 2200);
// 记得在 distory() 中清理
this.distory = function () {
clearInterval(t_autohight);
if (chart1) chart1.dispose();
}
```
### 弹窗样式
```javascript
// 弹窗样式
var style = document.createElement("style");
style.innerHTML = `
.popup-box {
position: absolute;
z-index: 999;
transform: translateX(calc(-50%)) translateY(calc(-100% + 4px));
pointer-events: none;
transition: all 0.5s;
opacity: 0;
}
.popup-box > .box {
border: 1px solid #6d8ef4;
background: linear-gradient(344deg, #0753b2, #05254e);
border-radius: 0.5em;
padding: 0.5em;
white-space: nowrap;
color: #ffffff;
pointer-events: all;
}
.popup-box > .line {
height: 3em;
width: 1px;
margin: auto;
border-left: 1px solid #0753b2;
}
.popup-box > .rlc {
width: 7px;
height: 7px;
background: #0753b2;
margin: auto;
border-radius: 4px;
}
`;
window.document.head.appendChild(style);
```
### 性能优化建议
1. **减少重复初始化**
```javascript
this.setdata = function (funame, data) {
if (ce) return; // 地图只初始化一次
if (chart1) return; // 图表只初始化一次
// ...初始化代码
}
```
2. **使用事件委托**
```javascript
// 不推荐
$5('.item').on('click', function() {
// ...
});
// 推荐
opdata.container.on('click', '.item', function() {
// ...
});
```
3. **及时清理资源**
```javascript
this.distory = function () {
clearInterval(t_autohight);
if (chart1) chart1.dispose();
if (cyc) cyc.distory();
if (ce) ce.destroy();
// 移除动态添加的样式
if (thos.style) thos.style.remove();
}
```
---
## 总结
Ciyon数据大屏系统采用**组件化**、**模块化**的设计理念:
✅ **优点**:
- 组件独立开发,易于维护
- 数据轮询自动化
- 屏幕自适应
- 支持多种可视化类型
- 丰富的CSS资源库(73个样式类 + 15种字体)
📌 **核心要点**:
1. 遵循命名规范(文件、接口、方法、CSS类名)
2. 实现三个核心方法:`setdata()`、`resize()`、`distory()`
3. 合理设置刷新频率,避免性能问题
4. 及时清理资源,防止内存泄漏
5. 使用BEM命名法避免CSS冲突
6. 充分利用bigscreen资源库(字体、边框、标题)
7. 使用 `Glob.bet` 实现屏幕自适应
🎨 **资源使用建议**:
- 字体:`fnt01`(大标题)、`eng02`(数字)
- 背景:`bd04`(现代海蓝色)
- 边框:`brimg34`(常用)、`brimg03`(薄边框)
- 标题:`cap09`(带倒影)、`cap02`(简洁)
🔧 **API核心**:
- `ciyclass.bigpanel` - 面板管理
- `ciyfn.big_setbetsize()` - 屏幕缩放
- `ciyfn.big_resolution()` - 分辨率检查
- `ciyclass.bigcychange` - 值循环切换
---
**版本**:v2.0
**更新时间**:2026-03-15
**维护团队**:Ciyon开发团队