本文件为公司统一配置(L1)的语言约束部分,涵盖 Tofly Vue2 前端项目的专属约定和模板。 按需动态加载:当任务涉及 Vue 2 / Options API / Element UI 前端代码编写时加载本文件。
公共规范(格式、命名、API层组织、权限模式、CRUD架构、Lint流程)已在公司统一配置 §六 中定义,本文件不再重复。
本仓库前端有两种可见的风格集群:
Tofly 标准管理风格(src/views/system/**、src/views/monitor/** 等)
v-hasPermi 权限门控dicts + dict-tag 字典渲染Pagination + RightToolbarFlowable 业务页面(src/views/function/**、src/views/todo/**)
规则:新模块优先使用 Tofly 标准 CRUD 风格;编辑遗留模块时遵循本地风格,除非要求重构否则不做大型重构。
tolfy-hrm-business)tofly-system 内部实体设计新页面export default { data, created/mounted, methods })@/ → src/src/utils/request.js 封装的 axiossrc/api/<module>/<entity>.js,已有的 views/**/api 可保留name:应使用 PascalCase;编辑遗留小写名称时保持兼容listX / getX / addX / updateX / delXthis.download(...)src/utils/request.jsrequest({ url, method, params/data }){ code, msg, data, rows, total }response.rows → 列表数据,response.total → 分页总数Search + Table + Dialog:
queryParamsdateRange + this.addDateRange(queryParams, dateRange)ids = selection.map(...) / single = selection.length !== 1 / multiple = !selection.lengthopen 控制可见性,title 指示新增/编辑,reset() 初始化默认值反馈:
this.$modal.msgSuccess(...) 或 this.$message.success(...),跟随本地文件风格this.$modal.confirm(...) 或 this.$confirm(...),跟随本地文件风格Vue2 CRUD 全局组件:Pagination, RightToolbar, DictTag
v-hasPermi="['module:resource:action']" 添加操作级权限(参见公司统一配置 §6.5)通用步骤见公司统一配置 §6.7,本节仅列出 Vue2 专属命令。
npm run lint(在 tofly-ui 目录下)list/get/add/update/delete/exportv-hasPermi 权限指令this.download 添加导出src/utils/request.js 而非新建 HTTP 封装this.$modal、this.download、parseTime、addDateRange)v-hasPermi<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
<el-form-item label="名称" prop="name">
<el-input v-model="queryParams.name" placeholder="请输入名称" clearable @keyup.enter.native="handleQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd" v-hasPermi="['hr:entity:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate" v-hasPermi="['hr:entity:edit']">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete" v-hasPermi="['hr:entity:remove']">删除</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" />
</el-row>
<el-table v-loading="loading" :data="entityList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="ID" prop="id" />
<el-table-column label="名称" prop="name" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)" v-hasPermi="['hr:entity:edit']">修改</el-button>
<el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)" v-hasPermi="['hr:entity:remove']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script>
import { listEntity, getEntity, delEntity, addEntity, updateEntity } from '@/api/hr/entity'
export default {
name: 'Entity',
data() {
return {
loading: true,
ids: [],
single: true,
multiple: true,
showSearch: true,
total: 0,
entityList: [],
open: false,
title: '',
queryParams: {
pageNum: 1,
pageSize: 10,
name: undefined
},
form: {},
rules: {}
}
},
created() {
this.getList()
},
methods: {
getList() {
this.loading = true
listEntity(this.queryParams).then(response => {
this.entityList = response.rows
this.total = response.total
this.loading = false
})
},
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
handleQuery() {
this.queryParams.pageNum = 1
this.getList()
},
resetQuery() {
this.resetForm('queryForm')
this.handleQuery()
},
handleAdd() {},
handleUpdate(row) {},
handleDelete(row) {}
}
}
</script>
submitForm() {
this.$refs['form'].validate(valid => {
if (!valid) return
const action = this.form.id ? updateEntity(this.form) : addEntity(this.form)
action.then(() => {
this.$modal.msgSuccess(this.form.id ? '修改成功' : '新增成功')
this.open = false
this.getList()
})
})
}
import { completeTask } from '@/views/todo/api/processTaks'
methods: {
submitTask(taskId) {
const variables = {
comment: this.form.comment,
approveResult: this.form.approveResult
}
completeTask(taskId, variables).then(() => {
this.$message.success('办理成功')
this.$emit('done')
})
}
}
注意:
最后更新:2026-04-22 版本:5.0.0(公共规范已提取至公司统一配置 §六)