# 大屏基础模版
**Repository Path**: yaolei123123/large-screen-basic-template
## Basic Information
- **Project Name**: 大屏基础模版
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-01-21
- **Last Updated**: 2026-01-21
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 项目git地址
```text
http://192.168.8.86/basic-project/fronted/screen-template
```
## 项目环境
```text
node.js >= 18.18.0
```
## 项目初始化
```text
npm i pnpm -g
pnpm i
```
## 项目启动
```text
pnpm dev
```
## 项目打包
```text
pnpm build
```
## 项目结构
```text
screen-template/
├─ index.html # 入口 HTML(Vite 注入构建产物)
├─ package.json # 项目依赖与脚本
├─ package-lock.json # 依赖锁定文件
├─ README.md # 项目说明(中文)
├─ tsconfig.json # TypeScript 配置
├─ vite.config.ts # Vite 构建配置
├─ node_modules/ # 依赖包目录(自动生成)
├─ public/ # 公开静态资源(原样拷贝,不经打包处理)
│ ├─ config/ # 运行时可替换配置
│ │ └─ config.json
│ └─ img/ # 图片资源(底图、纹理、标记等)
│ ├─ basemaps/ # 地图底图预览/配置图
│ ├─ marker/ # 地图标记点素材
│ └─ textures/ # 地图/3D 材质纹理
└─ src/ # 源码目录(参与打包)
├─ App.vue # 根组件(一般承载 router-view、地图)
├─ main.ts # 应用入口(创建应用/挂载插件)
├─ api/ # 接口请求分模块封装
│ ├─ common/ # 公共接口(如文件、媒体)
│ ├─ home/ # 首页相关接口
│ └─ login/ # 登录相关接口
├─ assets/ # 打包静态资源(会被处理、指纹化)
│ ├─ icons/ # 图标资源
│ │ └─ svg/ # SVG 图标
│ ├─ images/ # 图片(错误页/通用图)
│ └─ logo/ # 项目 logo、登录背景等
├─ components/ # 可复用组件
│ ├─ global/ # 全局通用组件(如头部)
│ └─ mars-work/ # 地图场景相关组件与生命周期封装
├─ hooks/ # 组合式 API Hooks(如 ECharts 封装)
├─ layout/ # 页面整体布局(头部/主体等)
│ ├─ layoutHeader/ # 布局-头部区域
│ └─ layoutMain/ # 布局-主体区域
├─ router/ # 路由配置与守卫
├─ stores/ # Pinia 状态管理
├─ styles/ # 全局样式与主题
├─ types/ # TypeScript 类型声明与扩展
├─ utils/ # 工具方法与封装(请求、校验、存储等)
└─ views/ # 业务页面(路由视图)
├─ home/ # 首页(含地图逻辑)
└─ login/ # 登录页
```
# 前端规范
## 1、项目命名
```javascript
// 【建议】
mall-management-system
// 【反例】
mall_management-system/ mallManagementSystem
```
##2、目录命名
全部采用小写方式, 以中划线分隔,有复数结构时,要采用复数命名法, 缩写不用复数。
```javascript
// 【建议】
scripts / styles / components / images / utils / layouts / demo-styles / demo-scripts / img / doc
// 【反例】
script/ style / demo_scripts / demoStyles / imgs / docs
```
## 3、JS 、CSS 、SCSS 、HTML 、PNG 文件命名
全部采用小写方式, 以中划线分隔。
```javascript
// 【建议】
render-dom.js / signup.css / index.html / company-logo.png
// 【反例】
renderDom.js / UserManagement.html
```
## 4、命名严谨性
代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,即使纯拼音命名方式也要避免
```javascript
// 【建议】
henan / luoyang/ rmb 等国际通用的名称,可视同英文
// 【反例】
DaZhePromotion [打折] / getPingfenByName() [评分] /int 某变量 =3
// 杜绝完全不规范的缩写,避免望文不知义:
// 【反例】
AbstractClass “缩写”命名成 AbsClass;condition “缩写”命名成 condi ,此类随意缩写严重降低了代码的可阅读性。
```
杜绝完全不规范的缩写,避免望文不知义:
## 5、css命名
1、类名使用小写字母,以中划线分隔
2、采用驼峰式命名
3、sass中的变量、函数、混合、placeholder 采用驼峰式命名
## 6、Javascript命名
1、采用小写驼峰命名 lowerCamelCase,代码中的命名均不能以下划线,也不能以下划线或美元符号结束
```javascript
// 【建议】
myName
// 【反例】
_name / name_ / name$
```
2、方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格,必须遵从驼峰形式
```javascript
// 【建议】
localValue /getHttpMessage()/ inputUserId
*其中 method 方法命名必须是 动词 或者 动词+名词 形式*
// 【建议】
saveShopCarData /openShopCarInfoDialog
// 【反例】
save / open / show / go
```
3、常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
```javascript
// 【建议】
MAX_STOCK_COUNT
// 【反例】
MAX_COUNT
```
## 7、使用 ES6+
必须优先使用 ES6+ 中新增的语法糖和函数。这将简化你的程序,并让你的代码更加灵活和可复用。比如箭头函数、await/async , 解构, let , for …of 等等。
## 8、函数定义
业务开发中提倡的做法, 箭头函数配合const函数一起使用
```javascript
// 【建议】
const getTableListData = () => { // TODO }
// 【反例】尽量不要出现混用,如下:
function getDomeData () {}
const getDome1Data = () => {}
```
## 9、变量定义
在项目或者开发过程中,尽量使用let或者const定义变量,可以有效的规避变量提升的问题,不在赘述,注意const一般用于声明常量或者值不允许改变的变量。
```javascript
// 【建议】
const myName = "张三"
let myName = "张三"
// 【反例】
var myName = "张三"
```
## 10、条件判断和循环最多三层
条件判断能使用三目运算符和逻辑运算符解决的,就不要使用条件判断,但是谨记不要写太长的三目运算符。如果超过 3 层请抽成函数,并写清楚注释。
## 11、请求数据
数据请求类、异步操作类需要使用try…catch捕捉异常。尽量避免回调地狱出现。
```javascript
// 【建议】
/**
* @description 获取列表数据
* @return void
*/
const getTableListData = async () => {
// 自己的业务处理TODO
try {
const res = await getTableListDataApi();
// TODO
} catch (error) {
// 异常处理相关
} finally {
// 最终处理
}
};
//【提倡】推荐接口定义带着Api结尾,比如我的方法是getTableListData,
//【提倡】内部逻辑调用的后端接口,那我的接口便可以定位为getTableListDataApi。
```
# 2、Vue 项目规范
## 1、组件文件名为 pascal-case 格式
组件名应该始终是多个单词组成(大于等于 2),且命名规范为 kebab-case 格式。这样做可以避免跟现有的以及未来的 HTML 元素相冲突,因为所有的 HTML 元素名称都是单个单词的。
```javascript
// 【建议】
components/
|- my-component.vue
// 【反例】
components/
|- myComponent.vue
|- MyComponent.vue
```
## 2、基础组件文件名为 base 开头,使用完整单词而不是缩写
```javascript
// 【建议】
components/
|- base-button.vue
|- base-table.vue
|- base-icon.vue
// 【反例】
components/
|- MyButton.vue
|- VueTable.vue
|- Icon.vue
```
## 3、和父组件紧密耦合的子组件应该以父组件名作为前缀命名
```javascript
// 【建议】
components/
|- todo-list.vue
|- todo-list-item.vue
|- todo-list-item-button.vue
|- user-profile-options.vue (完整单词)
// 【反例】
components/
|- TodoList.vue
|- TodoItem.vue
|- TodoButton.vue
|- UProfOpts.vue (使用了缩写)
```
## 4、文件命名
功能菜单的入口文件一定要带着name,同时其他编写的业务组件也推荐带着name,同时name的命名规则大写驼峰,且尽量要全局唯一(避免后期定位问题增加复杂度)。
```javascript
```
## 5、响应性变量
合理的使用响应性变量。数据量很大的对象或者数组,同时属性又是嵌套的对象,你的业务场景只需要第一层属性具有响应性,推荐使用shallowRef和shallowReactive定义响应性变量,这时不在推荐使用ref和reactive了。
## 6、必须为 v-for 设置键值 key
## 7、v-show 与 v-if 选择
如果运行时,需要非常频繁地切换,使用 v-show ;如果在运行时,条件很少改变,使用 v-if。
## 8、Hooks使用
在Vue3的项目中强烈推荐使用hooks进行功能的拆分和复用,下面来看一个列子,比如说,我要实现一个弹框的功能,下面常见的写法:
```javascript
const useEditModel = () => {
const isShow = ref(false);
/**
* 显示弹框
*/
const showModal = () => {};
/**
* 关闭弹框
*/
const cancelModal = () => {};
/**
* 提交操作
*/
const submitModal = () => {};
onBeforeMount(() => {
// TODO
});
return {
isShow,
showModal,
cancelModal,
submitModal,
};
};
// 其他地方使用
const { isShow, showModal, cancelModal, submitModal } = useEditModel();
```
## 9、代码注释 (vscode插件koroFileHeader ctrl+win+t 不起作用说明快捷键冲突)
功能开发时编写的相关方法要进行方法注释和说明,注释要遵循JSDOC规范。
```javascript
/**
* @description: 方法描述 (可以不带@description)
* @param {参数类型} 参数名称
* @param {参数类型} 参数名称
* @return 没有返回信息写 void / 有返回信息 {返回类型} 描述信息
*/
// 示例
/**
* @description 获取解析统计相关数据
* @param {Object} userInfo
* @param {Array} lists
* @param str 当前值字符串
* @return void
*/
```
## 10、动态图片url
为避免vite打包跳过动态图片url导致生产环境图片不显示,需按规范进行动态url引入
```javascript
//可正常使用
const images = import.meta.glob('../../assets/images/home/zy-*.png', { eager: true })
const url = images[`../../assets/images/home/zy-${type}.png`] as any
let obj = {
name: item.table_name,
num: item.count,
unit: item.table_name == '应急专家' ? '人' : '个',
url: url && url.default,
}
list.value.push(obj)
//不能正常使用 对于不确定的静态资源会跳过引入
let obj = {
name: item.table_name,
num: item.count,
unit: item.table_name == '应急专家' ? '人' : '个',
url: new URL('../../assets/images/home/zy-' + type + '.png', import.meta.url).href,
}
list.value.push(obj)
```
## 11、props使用
避免解构props,会导致数据失去响应式
```javascript
//会失去响应式
const { eventDetail, eventTaskTj } = defineProps<{
eventDetail?: EventVO;
eventTaskTj?: EventTaskTjVO
}>();
//不会丢失响应式
const props=defineProps<{
eventDetail?: EventVO;
eventTaskTj?: EventTaskTjVO
}>()
const { eventDetail, eventTaskTj } =toRefs(props);
```
# 3、新增文件规范
### 1、新增view
在 @/views文件夹下 创建对应的文件夹,一般性一个路由对应一个文件, 该模块下的功能就建议在本文件夹下创建一个新文件夹,各个功能模块维护自己的utils或components组件。
### 2、新增api
在 @/api文件夹下 创建对应的文件夹,一般与@/views文件夹对应,各个功能模块维护自己的index.ts或type.ts。
```javascript
// index.ts 文件内容如下
import request from '@/utils/request';
import { StatisticsDataVo } from './types';
/**
* @description: 查询统计数据
* @param {object} params
* @return {*} {Promise}
*/
export function getStatisticsData(params: StatisticsDataVo) {
return request({
url: '/home/statistics',
method: 'GET',
params
});
}
// type.ts 文件内容如下
export interface StatisticsDataVo {
total: number;
active: number;
inactive: number;
}
```
### 3、新增组件
在全局的 @/components 文件夹写一些全局的组件,如富文本,各种搜索组件,封装的分页组件等等能被公用的组件。 每个页面或者模块特定的业务组件则会写在当前 @/views下面。 如:@/views/system/components/xxx.vue。这样拆分大大减轻了维护成本
### 4、地图相关
1、项目中全局引用了mars3d 各个用到地图的组件在自己的文件夹下面建一个map.ts文,该文件维护该组件地图相关的操作。
2、全局的地图方法可以写在@/utils/map.ts文件中
```javascript
// 组件中使用
// 导入生命周期钩子
import useLifecycle from "@/components/mars-work/use-lifecycle";
// 导入地图相关功能
import * as mapWork from "./map";
useLifecycle(mapWork);
// map.ts 文件内容如下
import * as mars3d from "mars3d";
let map: mars3d.Map; // 地图对象
// 初始化当前业务
export async function onMounted(mapInstance: mars3d.Map): Promise {
map = mapInstance; // 记录map
}
// 释放当前业务
export function onUnmounted(): void {
if (!map) {
return;
}
map = null;
}
```