# yk-erp-api
**Repository Path**: muxun-ohh/yk-erp-api
## Basic Information
- **Project Name**: yk-erp-api
- **Description**: yk-erp后台接口
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-02-15
- **Last Updated**: 2025-03-07
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# ERP项目
## 项目原型
[翼凯ERP](https://modao.cc/app/OUgx0pzNrpnejo4BRWww1N#screen=sle4152hxknxzr5)
## 项目结构
~~~
yikai-erp-api # 父项目
├─erp-common #子模块 通用模块 封装底层结构 引用后可以直接进行web开发
│ └─src
│ ├─main
│ ├─java
│ │ └─com
│ │ └─by
│ │ └─common
│ │ ├─bean #公共JavaBean
│ │ ├─config #系统配置
│ │ ├─controller #通用的控制类
│ │ ├─crud #增删改查接口封装
│ │ ├─ex #自定义异常
│ │ └─group #分组验证
│ └─resources #项目配置文件
├─erp-customer
│ └─src
│ ├─main
│ ├─java
│ │ └─com
│ │ └─by
│ │ ├─bean #实体类 mybatis别名包
│ │ ├─controller #控制层
│ │ ├─mapper #持久层
│ │ ├─query #查询条件封装
│ │ └─service #业务层
│ │ └─impl #业务层实现类
│ └─resources #配置文件
│ └─mybatis #mybatis配置目录
├─erp-swagger #接口文档 自定义的启动器 引用后 配置相关信息 可以使用接口文档相关注解
└─erp-token #token启动器 引用后提供TokenTemplate工具类,提供默认拦截验证功能
~~~
## 开发前期
面试: 说一下你们软件开发的流程
1. 需求分析
> 前期分析: 了解客户的需求 产品经理------原型
>
> 开发团队:
>
> * 项目经理 管理整个项目 保证项目的正常交付
>
> * 技术经理 负责整个项目的技术 攻克技术难点
>
> 架构师
>
> * 产品经理 根据用户需求 不断完善原型
>
> > 1. 墨刀
> > 2. axure
>
> * 开发组长
>
> * 开发人员
2. 开发
> 开会 讨论需求
>
> 需求分析 、数据库设计
>
> 统一规范:
>
> 常用字段:
>
> * 创建时间 createTime timestamp
> * 更新时间 updateTime
> * 创建人
> * 更新人
> * 逻辑删除 isdel 0 1
>
> 接口开发
* 开发计划
> 开发时间:最少1/3 时间去测试
>
> 估计时间: 1*1.5 /2 3
>
> 项目管理软件:
>
> * jria
> * 禅道
> * teambtion
> * 腾讯云
> * 阿里云
> * ....
## 分析设计
跨境贸易:外销
客户-----查看产品------询价------报价------同意=-----订单-----(销售采购 )----供应商生产----发货----验收
## 客户功能
* 客户列表 多条件 分页
* 新增客户
* 更新客户
* 导入
* 导出
* 重置密码
* 客户登录
* 忘记密码
## mybaits获取主建
## 三层结构

## 三个模块
* 控制层模块 -----------依赖于业务层模块
+ 增加 post
+ 删除 delete
+ 查找 get
+ 修改 put
* 业务层模块------------持久层模块
* -持久层模块
## 按业务划分模块
# 中后台
## 初始化
> * 若依
> * [其它](https://blog.csdn.net/qq_37237487/article/details/144157743)
~~~shell
#安装pnpm
npm install -g pnpm
#查看镜像
npm config get registry
# https://registry.npmmirror.com
#默认镜像 https://registry.npmjs.org
#设置淘宝镜像
npm config set registry=https://registry.npmmirror.com
#进入目录 安装依赖
pnpm install
#运行
pnpm dev
~~~
## 配置路由
TypeScript 是JavaScript的超集.
SPA single page application 单页应用
安装图标库:
~~~shell
pnpm install @element-plus/icons-vue
~~~
一个js文件就是模块,作用是复用代码。
## 组合 式API中路由的使用
在main.ts中 app.use(router); 安装路由插件(插件就是vue实例上增加属性或方法):
在vue实例上增加两个属性:
* $router 代表路由实例 用于路由跳转
* $route 代表路由信息(路由参数)
那么组合式API,要想使用,需要通过两个函数:
* useRouter() 返回路由实例
* useRoute() 返回路由信息
跳转:
[官网查看](https://router.vuejs.org/zh/guide/essentials/navigation.html)
~~~javascript
// 字符串路径
router.push('/users/eduardo')
// 带有路径的对象
router.push({ path: '/users/eduardo' })
// 命名的路由,并加上参数,让路由建立 url
router.push({ name: 'user', params: { username: 'eduardo' } })
// 带查询参数,结果是 /register?plan=private
router.push({ path: '/register', query: { plan: 'private' } })
// 带 hash,结果是 /about#team
router.push({ path: '/about', hash: '#team' })
~~~
## 产品
商品图片: 正常上传,存储到服务器,有图片的相对目录
材质: 名称 编号(自动生成的) 更新时间 操作人
产品型号: 名称 创建时间
品牌: 名称 创建时间
客户类型: 类型
字典表
典型的上下级关系:
* 分类
* 部门
* 省市区
* 行业
通过父id维护上下级关系
## 编码(唯一)
询价单号:
### 归零机制
编码组成: 前缀+日期+序号
订单编号: dd20250001
* 按日归零
> dd202502200001 dd202502200002
>
> 假如到了21号
>
> dd202502210001 ......
* 按月归零
> dd2025020001 .....
>
> dd2025030001....
* 按年归零
> dd20250001
### 商品类别编码
类别编码:
> 10 家用电器
>
> 11 手机
>
> 1 12 电脑
>
> > 3 电脑整机 1201
> >
> > > 笔记本 120101
> > >
> > > 10 游戏本 120102
> >
> > 电脑配件 1202
> >
> > .....
商品: 所属类别编码 联想... 120102
查询: like '120102%'
like '1201%'
like '12%'
> 假如存类别id A 10
>
>
商品编码:仓库编码+类别编码+序号
11201020001
### 权限
分类:
* 功能权限 RBAC
* 数据权限
用户信息:
* 最低权限 人的名称 家庭 。。。
* 高
* ,,,,
CRM系统:客户关系管理系统
要求: 销售人员只能查看自己的客户
销售经理: 查看整个团队所有销售人员的客户资料
销售总监: 查看所有团队的客户资料
涉及:
* 部门
> 百度:
>
> 10 技术部
>
> 11 宣传部
>
> 12 市场部
>
> > 1201 销售一部
> >
> > 1202 销售二部
* 岗位 销售人员 销售经理 销售总监
* 员工
> 张三 120101
>
> 李四 120102
>
> 。。。。
设计客户表时: 添加人 拥有人 (120101)
> 假如:张三 离职 客户的拥有人改为李四
查询时根据岗位判断:
* 如果是销售人员 查询拥有人=销售人员编码 120101
* 如果是销售经理 查询拥有人 like '销售经理所在部门编码%' '1201%'
* 如果是总监 查询拥有人 like ‘12%’
## 询价单
> 网购:
>
> > 订单表-----多个----订单明细
>
> 订单表: 订单编号 订单金额 订单状态 订单人 订单时间 收货 人 收货人电话 地址
>
> 订单明细表:商品id , 商品名称 价格 数量 。。。 (商品id 购买数量 )
* 询价表 编码 类型 联系人名称 电话 状态 总价 运费 询价人 (客户) 询价时间 询价描述 更新时间 ...
* 询价明细 产品名称 型号 价格 数量 产器id 询价单id
## 字典
* 新增
* 查询 根据pid来查询
* 查询 根据code (分组编码 ) 查询字典配置
宽高:
* vh view height 1vh 1%高度
* vw view width
## 单向数据流
所有的 props 都遵循着**单向绑定**原则,props 因父组件的更新而变化,自然地将新的状态向下流往子组件,而不会逆向传递
注意:
* 属性是只读的 ,不要尝试更改属性值
* 如果有更改需求:
> 1. 属性做为初始值使用,声明一个响应式对象,它的值是属性值,可以对响应式对象进行更改
> 2. **需要对传入的 prop 值做进一步的转换** 通过计算属性实现
布尔属性值,如果为true,可以简化为属性名,如
~~~vue
~~~
## 子组件向父组件传参(事件)
通过事件向父组件传参:
事件实现:
子组件:
* 声明事件 通过const emit=defineEmits([事件名称,.......]) 来 声明
~~~javascript
//声明事件 关闭事件
const emit=defineEmits(["close"]);
~~~
* 触发事件 ,在子组件中 在合适的时机触发自定义事件 emit("事件名称 ")
~~~javascript
//用户点击关闭
function cls(){
console.log("--------cls")
//触发事件
emit("close");
}
~~~
注意:在模板中,可以通过$emit(事件) 直接触发事件
~~~vue
~~~
父组件:
* 要监听子组件中 对应的事件
~~~vue
~~~
触发事件函数:
* $emit("事件名称") 只是触发事件,父组件监听
* 事件参数 $emit("事件名称",args1,arg2,......) 后面可传递任意多个能数
父子组件
* 父组件向子组件传参 通过子组件 属性实现
* 子组件向父组件传参 通过事件 $emit("事件",参数.....)
广州实地集团:
售前系统 ,两个app: 开发时间5个月
* 拓客
* 案场
uniapp
后端:
* 数据库设计
* 接口开发
* 中后台开发
* 项目部署
* 测试