Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 19 additions & 15 deletions packages/toolkits/pro/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,9 @@ tiny-toolkit-pro 套件,开箱即用的中后台前端/设计解决方案
tiny init pro
```
### 配置项目名称、描述
项目名称默认是当前所在文件夹名称。

```
? 请输入项目名称:
? 请输入项目名称: (tiny-pro)
? 请输入项目描述: (基于TinyPro套件创建的中后台系统)
```
### 选择前端技术栈
Expand All @@ -31,8 +30,6 @@ tiny init pro
```
? 请选择您希望使用的服务端技术栈: (Use arrow keys)
> Egg.js
Spring Cloud
Nest.js
暂不配置
```
### 选择数据库(可选配置)
Expand All @@ -43,13 +40,22 @@ tiny init pro
```
### 数据库准备工作
可使用本地数据库或云数据库,请提前安装配置本地数据库服务或者云数据库服务,确保连接正常可用。
- MySQL[下载链接](https://dev.mysql.com/downloads/)
- 云数据库推荐使用[华为云数据库RDS](https://support.huaweicloud.com/productdesc-rds/zh-cn_topic_dashboard.html),可参考[云服务最佳实践](https://opentiny.design/vue-pro/docs/advanced/practiced) 创建数据库。

**本地数据库:** 本地数据库安装MySQL
- 查看本机操作系统,选择合适的安装包版本[下载MySQL](https://dev.mysql.com/downloads/)
- 安装完成MySQL软件
- 进行初始化配置,设置端口、用户、登录密码等,测试连接正常

**云数据库:** 云数据库推荐使用[华为云数据库RDS](https://support.huaweicloud.com/productdesc-rds/zh-cn_topic_dashboard.html)
- 注册华为帐号并开通华为云
- 选择合适的计费模式购买并配置数据库实例
- 选择合适的连接模式进行连接
具体开通过程请参考:[RDS for MySQL快速入门](https://support.huaweicloud.com/qs-rds/rds_02_0008.html),也可使用TinyCLI云服务插件以命令行的方式开通创建,具体请参考:[TinyCLI 云服务插件](https://opentiny.design/vue-pro/docs/advanced/plugin)


### 配置数据库信息

- **初始化过程中会自动创建数据库和表,建议输入新的数据库名称以免造成数据库覆盖风险。**
### 配置数据库信息
**初始化过程中会自动创建数据库和表,建议输入新的数据库名称以免造成数据库覆盖风险!**
```
? 请输入数据库地址: (localhost)
? 请输入数据库端口: (3306)
Expand All @@ -67,20 +73,18 @@ tiny init pro

### 开启本地服务器

Web
前端
```
cd web && npm run start
```
Egg
后端
```
cd server && npm run dev
```

### 代码打包
进入对应目录下执行
```
npm run build
```
### 构建部署
前端:Vue项目采用Vite工具构建,请参考[Vite 部署指南](https://cn.vitejs.dev/guide/static-deploy.html)、[Vite 生产环境指南](https://cn.vitejs.dev/guide/build.html)
后端:Egg项目请参考[Egg构建部署指南](https://www.eggjs.org/zh-CN/core/deployment)

## 维护者

Expand Down
2 changes: 1 addition & 1 deletion packages/toolkits/pro/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@opentiny/tiny-toolkit-pro",
"version": "1.0.6",
"version": "1.0.10",
"description": "TinyPro 开箱即用的中后台前端/设计解决方案",
"main": "dist/index.js",
"typings": "dist/index.d.ts",
Expand Down
67 changes: 43 additions & 24 deletions packages/toolkits/pro/src/lib/init.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,20 @@ import utils from './utils';
const log = logs('tiny-toolkit-pro');
const VUE_TEMPLATE_PATH = 'tinyvue';
const NG_TEMPLATE_PATH = 'tinyng';
const DEFAULT_PROJECT_NAME = 'tiny-pro';

/**
* 询问创建项目的描述,使用的技术栈
*
* @returns object { description: 项目描述,framework: 框架, name: 项目名称 ,serverFramework:使用技术栈, dialect:数据库,DB_host:数据库地址,DB_port:数据库端口,database:数据库名称,username:数据库用户名,password:数据库密码,}
*/
const getProjectInfo = (): Promise<ProjectInfo> => {
const basename = path.basename(utils.getDistPath());
const question: QuestionCollection<ProjectInfo> = [
{
type: 'input',
name: 'name',
message: '请输入项目名称:',
default: basename,
default: DEFAULT_PROJECT_NAME,
// 必填校验
validate: (input: string) => Boolean(input),
},
Expand All @@ -51,12 +51,23 @@ const getProjectInfo = (): Promise<ProjectInfo> => {
message: '请选择您希望使用的服务端技术栈:',
choices: [
{ name: 'Egg.js', value: ServerFrameworks.EggJs },
{ name: 'Spring Cloud', value: ServerFrameworks.SpringCloud },
{ name: 'Nest.js', value: ServerFrameworks.NestJs },
{ name: '暂不配置', value: ServerFrameworks.Skip },
],
default: ServerFrameworks.EggJs,
default: ServerFrameworks.Skip,
prefix: '*',
when: (answers) => answers.framework === VUE_TEMPLATE_PATH,
},
{
type: 'list',
name: 'serverConfirm',
message:
'请确保已安装数据库服务(参考文档 https://www.opentiny.design/tiny-cli/docs/toolkits/pro#database):',
choices: [
{ name: '已完成数据库服务安装,开始配置', value: true },
{ name: '暂不配置服务端', value: false },
],
prefix: '*',
when: (answers) => answers.serverFramework === ServerFrameworks.EggJs,
},
{
type: 'list',
Expand All @@ -68,7 +79,7 @@ const getProjectInfo = (): Promise<ProjectInfo> => {
],
default: 'mysql',
prefix: '*',
when: (answers) => answers.serverFramework !== ServerFrameworks.Skip,
when: (answers) => answers.serverConfirm,
},
{
type: 'input',
Expand Down Expand Up @@ -118,7 +129,7 @@ const getProjectInfo = (): Promise<ProjectInfo> => {
* @answers 询问客户端问题的选择值
*/
const createDatabase = async (answers: ProjectInfo) => {
const { dialect, host, port, database, username, password } = answers;
const { name, dialect, host, port, database, username, password } = answers;
if (!dialect) return;

log.info('开始连接数据库服务...');
Expand All @@ -139,7 +150,7 @@ const createDatabase = async (answers: ProjectInfo) => {
await connection.query(` USE ${database}`);

// 读取sql文件、新建表
const serverPath = utils.getDistPath('server');
const serverPath = utils.getDistPath(`${name}/server`);
const databaseSqlDir = path.join(serverPath, 'app', 'database');
const tableSqlDirPath = path.join(databaseSqlDir, 'table');
const files = fs.readdirSync(tableSqlDirPath);
Expand Down Expand Up @@ -170,10 +181,10 @@ const createDatabase = async (answers: ProjectInfo) => {
* @dbAnswers 询问服务端配置的选择值
*/
const createServerSync = (answers: ProjectInfo) => {
const { serverFramework, dialect } = answers;
const { name, serverFramework, dialect } = answers;
// 复制服务端相关目录
const serverFrom = utils.getTemplatePath(`server/${serverFramework}`);
const serverTo = utils.getDistPath('server');
const serverTo = utils.getDistPath(`${name}/server`);
const defaultConfig = {
// 在未配置数据库信息时,使用默认值替换ejs模板
dialect: 'mysql',
Expand All @@ -195,14 +206,14 @@ const createServerSync = (answers: ProjectInfo) => {
* @dbAnswers 询问服务端配置的选择值
*/
const createProjectSync = (answers: ProjectInfo) => {
const { framework, description, name, serverFramework } = answers;
const { framework, description, name, serverConfirm } = answers;
const templatePath =
framework === VUE_TEMPLATE_PATH ? VUE_TEMPLATE_PATH : NG_TEMPLATE_PATH;

// 模板来源目录
const from = utils.getTemplatePath(templatePath);
// 复制模板的目标目录
const to = utils.getDistPath(serverFramework ? 'web' : '');
const to = utils.getDistPath(serverConfirm ? `${name}/web` : name);

fs.copyTpl(from, to);
// 将项目名称、描述写入 package.json中
Expand All @@ -220,7 +231,7 @@ const createProjectSync = (answers: ProjectInfo) => {
}

// 如果不对接服务端,全部接口采用mock
if (!serverFramework) {
if (!serverConfirm) {
try {
const envPath = path.join(to, '.env');
const envConfig = dotenv.parse(
Expand All @@ -244,22 +255,23 @@ const createProjectSync = (answers: ProjectInfo) => {
// 安装依赖
export const installDependencies = (answers: ProjectInfo) => {
const prefix = cliConfig.getBinName();
const { name, serverFramework, serverConfirm } = answers;
// egg服务端 安装依赖并启动
if (answers.serverFramework === ServerFrameworks.EggJs) {
log.info('正在安装 npm 依赖,安装过程需要几十秒,请耐心等待...');
if (serverConfirm && serverFramework === ServerFrameworks.EggJs) {
log.info('正在安装服务端 npm 依赖,安装过程需要几十秒,请耐心等待...');
spawn.sync('npm', ['install'], {
cwd: 'server/',
cwd: `${name}/server/`,
stdio: 'inherit',
});
log.success('npm 依赖安装成功');
log.success('服务端 npm 依赖安装成功');
}
// npm 依赖安装
log.info('正在安装 npm 依赖,安装过程需要几十秒,请耐心等待...');
log.info('正在安装客户端 npm 依赖,安装过程需要几十秒,请耐心等待...');
spawn.sync('npm', ['install'], {
cwd: answers.serverFramework ? 'web/' : null,
cwd: serverConfirm ? `${name}/web` : `${name}/`,
stdio: 'inherit',
});
log.success('npm 依赖安装成功');
log.success('客户端 npm 依赖安装成功');

/* prettier-ignore-start */
console.log(
Expand All @@ -268,21 +280,27 @@ export const installDependencies = (answers: ProjectInfo) => {
)
);

if (answers.serverFramework) {
if (serverConfirm) {
console.log(
chalk.green(
`${chalk.yellow('$ cd web && npm run start')} # 开启web开发环境`
`${chalk.yellow(
`$ cd ${name}/web && npm run start`
)} # 开启web开发环境`
)
);
console.log(
chalk.green(
`${chalk.yellow('$ cd server && npm run dev')} # 开启server开发环境`
`${chalk.yellow(
`$ cd ${name}/server && npm run dev`
)} # 开启server开发环境`
)
);
} else {
console.log(
chalk.green(
`${chalk.yellow(`$ ${prefix} start`)} # 可一键开启项目开发环境`
`${chalk.yellow(
`$ cd ${name} && ${prefix} start`
)} # 可一键开启项目开发环境`
)
);
}
Expand Down Expand Up @@ -316,6 +334,7 @@ export default async () => {
createProjectSync(projectInfo);
} catch (e) {
log.error('项目模板创建失败');
return;
}

// 初始化数据库
Expand Down
1 change: 1 addition & 0 deletions packages/toolkits/pro/src/lib/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ export interface ProjectInfo {
framework: string;
name: string;
serverFramework: ServerFrameworks;
serverConfirm?: boolean;
dialect?: string;
host?: string;
port?: number;
Expand Down