icc-cli
v1.0.17
Published
icc-tool
Downloads
19
Readme
icc-cli
icc-cli 是基于vue封装的脚手架
初始化项目
icc init 【objectName】
创建模块
icc createpage 【moduleName】
编译指定模块
icc build 【moduleName】
编译全部模块
icc build
发布代码到服务器
项目发布命令
icc deploy 【serve】
生成swagger api文件
生成swagger api文件命令
icc apiGenerate
代码发布需要在项目根目录创建icc.config.js 配置文件,配置文件如下所示
function resolve(dir) {
return require('path').join(process.cwd(), dir)
}
module.exports = {
// 每个模块的公共资源引用
cdn: [
{
type: 'js',
src: 'public/js/plugins.js'
},
{
type: 'css',
src: 'public/common.css'
}],
externals: {
vue: 'Vue'
},
// 项目运行的端口
port:3000,
// 项目的反向代理
proxy: {
'/api': {
target: 'http://0.0.0.0:80',
pathRewrite:{
'^/api':''
},
changeOrigin: true,
logLevel:'info'
},
},
// webpack 的别名配置
alias: {
'vue$': 'vue/dist/vue.esm.js',
'@': resolve('src'),
'@c': resolve('src/components'),
'@common': resolve('src/common'),
'@mixins': resolve('src/common/mixins'),
'@store': resolve('src/store'),
'@api': resolve('src/api')
},
// swagger api 生成
apiGenerate: {
serverName: {
swagger: '', //swagger 服务地址
template: 'axios',// 默认模板 支持axios umi-request 传入自定义模板该选项可不配置
apiTemplate: './api.ejs',//自定义生成的模板 在项目根目录创建api.ejs 模板文件
// importText: ``,
typescript: false,//是否生成ts
outputDir: 'src/service/serverName'// 生成api文件的路径
}
},
// 发布服务器配置
deploy:{
serveName:'online',//默认要发布的服务器
serveConfig:{
online:{
host: '0.0.0.0',//服务器连接地址
port: 22,//服务器端口
username: 'root',//服务器连接用户名
password: '******',//服务器连接密码
distPath: 'dist',// 要发送的代码包本地目录,可以是绝对路径,也可以是相对路径
remoteBuildPath:'/opt/deployTest/html',// 远程服务器部署路径(最终Nginx指定要访问的路径)
remoteCodePath: '/opt/deployTest/back',// 临时存放代码路径
buildScript: 'npm run build'//项目打包的npm命令
}
}
},
// 项目开发时启动的模块
dev_modules: [
'index',
'login',
'workbench',
]
}
自定义模板的的格式
<%_ if(importText !== '') { -%>
<%- importText %>
<%_ } else { -%>
import HttpRequest from '@common/libs/axios'
const ajax = new HttpRequest(`<%- basePath %>`)
const axios = ajax.request
<%_ } -%>
<%_ if(typescript) { -%>
import {
<%_ deps.forEach((dep) => { -%>
<%- dep %>,
<%_ }); -%>
} from './typings';
<%_ } -%>
<% apis.forEach((api) => { %>
/**
* @method <%- api.name %>
<%_ if(api.request.filter.path.length !== 0||api.request.urlText.indexOf('pathVars')!==-1) { -%>* @param {Object} pathVars
<%_ api.request.filter.path.forEach((param) => { -%>
* @param {<%- param.type %>} pathVars.<%- param.name %> <%- param.description %>
<%_ }); -%>
<%_ } -%>
<%_ if(api.request.filter.query.length !== 0) { -%>* @param {Object} params
<%_ api.request.filter.query.forEach((param) => { -%>
* @param {<%- param.type %>} params.<%- param.name %> <%- param.description %>
<%_ }); -%>
<%_ } -%>
<%_ if(api.request.filter.body.length !== 0) { -%>* @param {Object} data
<%_ api.request.filter.body.forEach((param) => { -%>
* @param {<%- param.type %>} data.<%- param.name %> <%- param.description %>
<%_ }); -%>
<%_ } -%>
* @description <%- api.description %> <%- api.request.method %> <%- api.request.url %>
*/
export async function <%- api.name %> (
<%_ if(api.request.filter.path.length !== 0||api.request.urlText.indexOf('pathVars')!==-1) { -%>
pathVars<%_ if(typescript) { -%>: {
<%_ api.request.filter.path.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
<%_ if(api.request.filter.query.length !== 0) { -%>
params<%_ if(typescript) { -%>: {
<%_ api.request.filter.query.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
<%_ if(api.request.filter.body.length !== 0) { -%>
data<%_ if(typescript) { -%>: {
<%_ api.request.filter.body.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
<%_ if(api.request.filter.formdata.length !== 0) { -%>
body<%_ if(typescript) { -%>: {
<%_ api.request.filter.formdata.forEach((param) => { -%>
<%- param.name %><% if(!param.required) { %>?<% } %>: <%- param.type %>; // <%- param.description %>
<%_ }); -%>
}<%_ } -%>,
<%_ } -%>
options<%_ if(typescript) { -%>?: Record<string, any><%_ } -%>,
)<%_ if(typescript) { -%>: Promise<<%- api.response.type %>><%_ } -%> {
return axios({
method: '<%- api.request.method %>',
url: `<%- api.request.urlText %>`,
<%_ if(api.request.filter.query.length !== 0) { -%>
params: {
...params,
},
<%_ } -%>
<%_ if(api.request.filter.body.length !== 0) { -%>
data: {
...data,
},
<%_ } -%>
<%_ if(api.request.filter.formdata.length !== 0) { -%>
headers: { 'content-type': 'application/x-www-form-urlencoded' },
data: {
...data,
},
<%_ } -%>
...(options || {}),
})
}
<%_ }); -%>
模板文件 ejs 数据源apiData 数据格式说明
export interface types {
// 是否是泛型
isGenerics: boolean,
// ts interface type name
name: string,
// 枚举
enum: [],
//
params: Array<{
// 是否是泛型
isGenerics: boolean,
// 字段名称
name: string,
// 字段类型
type: string,
// 字段描述
description: string,
// 是否必须
required: boolean
}>
}
export interface apis {
// 对应后端 controller 的名称
tag: string,
// 后端的接口方法名称 可以用作javascript方法名称
name: string,
// 当前接口的描述信息
description: string
// 接口的请求体数据
request: {
// 接口请求地址
url: string,
// 地址有路径 path 参数 处理后的接口地址
urlText: string,
// 接口请求方式
method: 'GET' | 'POST' | 'PUT' | 'DELETE',
params: Array<{
in: string,
name: string,
type: string,
description: string,
required: boolean
}>,
// 接口参数
filter:{
// 路径参数集合
path:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>,
// url 参数集合
query:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>,
// jsonData 参数集合
body:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>,
// formdata 参数集合
formdata:Array<{
in: string,
name: string,
type: string,
description: string,
required: string
}>
}
},
// 接口响应返回数据对应类型
response: {
// 对应types中 name === type 的数据
type: string
}
}
export interface apiData {
host: string,
// 接口地址的前缀路径 默认是swagger的basePath 在生成配置中配置了就取配置文件中的basePath
basePath: String,
// 接口类型数据
types: Array<types>,
// 后端接口 controller 文件内的所有接口数据
apis: Array<apis>
}