Compare commits

...

24 Commits

Author SHA1 Message Date
芋道源码
f341ba4d3c
!463 update src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue.
Merge pull request !463 from 最后的梦想/N/A
2024-07-07 03:33:07 +00:00
芋道源码
3938a78db2
!472 fix: 修复CRM合同详情中团队成员未展示权限编辑的问题
Merge pull request !472 from downeyin/downey
2024-07-07 03:30:19 +00:00
YunaiV
2871961582 docs: update README 2024-07-07 11:23:27 +08:00
YunaiV
a9ca98036c Merge branch 'master' of https://github.com/yudaocode/yudao-ui-admin-vue3 2024-07-07 11:22:26 +08:00
芋道源码
922b9edfcb
Merge pull request #60 from selicens/develop-readme
docs: update README
2024-07-07 11:21:33 +08:00
芋道源码
c825216063
Merge pull request #63 from geekymv/fix-leave-status
修改OA请假示例审批结果字段
2024-07-07 11:19:19 +08:00
downeyin
f70c8dcee2 fix: 修复CRM合同详情中团队成员未展示权限编辑的问题 2024-07-06 23:31:59 +08:00
geekymv
db3b8285d1 修改OA请假审批结果字段 2024-07-05 17:54:05 +08:00
最后的梦想
d66664b3d4
update src/components/bpmnProcessDesigner/package/penal/flow-condition/FlowCondition.vue.
修复:流程设计器bpmn流转条件-流转类型选择默认流转路径,未正确显示/

Signed-off-by: 最后的梦想 <1971063665@qq.com>
2024-06-24 01:53:12 +00:00
芋道源码
a0ecfed693
!461 【轻量级 PR】 /mp/open/ -> /admin-api/mp/open/
Merge pull request !461 from 21克的爱情/master
2024-06-22 06:54:13 +00:00
21克的爱情
8eee46d85c
/mp/open/ -> /admin-api/mp/open/
Signed-off-by: 21克的爱情 <raohong07@163.com>
2024-06-20 07:13:35 +00:00
芋道源码
3f3faaca9b
Merge pull request #56 from DevDengChao/feat/extract-default-login-info
提取默认登录使用的租户与账号密码, 规避潜在的账户泄露问题
2024-06-15 18:18:37 +08:00
ZhouWei
e83df37616 docs: update README 2024-06-05 12:44:50 +08:00
DevDengChao
d883b860ac refactor: 提取默认登录使用的租户与账号密码, 规避潜在的账户泄露问题 2024-05-21 17:44:37 +08:00
芋道源码
be978f2e9f
Merge pull request #53 from DevDengChao/fix/wx-pay-channels
fix: 修复无法配置微信原生支付与网站支付的问题
2024-05-11 23:26:30 +08:00
芋道源码
663c8b3824
Merge pull request #42 from JJBoy1995/fix-bug
【修复】商城管理首页统计数据显示问题
2024-05-11 23:25:05 +08:00
芋道源码
05e6c2c2df
Merge pull request #50 from DevDengChao/fix/demo-order-return-url
fix: 修复实例订单完成支付后跳转到 404 页面的问题
2024-05-11 23:23:45 +08:00
芋道源码
057a980982
Merge pull request #45 from DevDengChao/fix/submit-product-property-by-enter
fix: 修复填写商品属性后按回车键导致页面刷新的问题
2024-05-11 22:34:23 +08:00
DevDengChao
7883e3161d fix: 修复微信原生支付与网站支付无法配置的问题 2024-05-11 11:00:00 +08:00
DevDengChao
0275cb6dd7 fix: 修复 el-upload 组件提示 http-request 属性报错的问题 2024-05-11 10:59:59 +08:00
DevDengChao
e1d2305ddd fix: 补充缺失的微信 Native 支付与 WAP 支付枚举 2024-05-11 10:59:59 +08:00
DevDengChao
79f011fe17 fix: 修复实例订单完成支付后跳转到 404 页面的问题 2024-05-10 10:24:57 +08:00
DevDengChao
1ce3343578 fix: 修复填写商品属性后按回车键导致页面刷新的问题 2024-05-09 15:02:45 +08:00
JJBoy
1cf286b057 【修复】商城管理首页统计数据显示问题
(cherry picked from commit 78dd2fa38a2d040c1c97d70cababc4f9265ac705)
2024-05-08 21:16:09 +08:00
15 changed files with 94 additions and 182 deletions

5
.env
View File

@ -18,3 +18,8 @@ VITE_APP_DOCALERT_ENABLE=true
# 百度统计
VITE_APP_BAIDU_CODE = a1ff8825baa73c3a78eb96aa40325abc
# 默认账户密码
VITE_APP_DEFAULT_LOGIN_TENANT = 芋道源码
VITE_APP_DEFAULT_LOGIN_USERNAME = admin
VITE_APP_DEFAULT_LOGIN_PASSWORD = admin123

View File

@ -54,17 +54,16 @@
推荐 VS Code 开发,配合插件如下:
| 插件名 | 功能 |
|-------------------------------|--------------------------|
| TypeScript Vue Plugin (Volar) | 用于 TypeScript 的 Vue 插件 |
| Vue Language Features (Volar) | Vue3.0 语法支持 |
| unocss | unocss for vscode |
| Iconify IntelliSense | Iconify 预览和搜索 |
| i18n Ally | 国际化智能提示 |
| Stylelint | Css 格式化 |
| Prettier | 代码格式化 |
| ESLint | 脚本代码检查 |
| DotENV | env 文件高亮 |
| 插件名 | 功能 |
|-------------------------------|---------------------|
| Vue - Official | Vue 与 TypeScript 支持 |
| unocss | unocss for vscode |
| Iconify IntelliSense | Iconify 预览和搜索 |
| i18n Ally | 国际化智能提示 |
| Stylelint | Css 格式化 |
| Prettier | 代码格式化 |
| ESLint | 脚本代码检查 |
| DotENV | env 文件高亮 |
## 🔥 后端架构

View File

@ -129,7 +129,7 @@ const updateFlowType = (flowType) => {
conditionExpression: null
})
bpmnInstances().modeling.updateProperties(toRaw(bpmnElementSource.value), {
default: bpmnElement.value
default: toRaw(bpmnElement.value)
})
return
}

View File

@ -109,6 +109,14 @@ export const PayChannelEnum = {
code: 'wx_app',
name: '微信 APP 支付'
},
WX_NATIVE: {
code: 'wx_native',
name: '微信 Native 支付'
},
WX_WAP: {
code: 'wx_wap',
name: '微信 WAP 网站支付'
},
WX_BAR: {
code: 'wx_bar',
name: '微信条码支付'

View File

@ -313,7 +313,7 @@ export const fenToYuan = (price: string | number): string => {
*/
export const calculateRelativeRate = (value?: number, reference?: number) => {
// 防止除0
if (!reference) return 0
if (!reference || reference == 0) return 0
return ((100 * ((value || 0) - reference)) / reference).toFixed(0)
}

View File

@ -184,9 +184,9 @@ const loginData = reactive({
captchaEnable: import.meta.env.VITE_APP_CAPTCHA_ENABLE,
tenantEnable: import.meta.env.VITE_APP_TENANT_ENABLE,
loginForm: {
tenantName: '芋道源码',
username: 'admin',
password: 'admin123',
tenantName: import.meta.env.VITE_APP_DEFAULT_LOGIN_TENANT || '',
username: import.meta.env.VITE_APP_DEFAULT_LOGIN_USERNAME || '',
password: import.meta.env.VITE_APP_DEFAULT_LOGIN_PASSWORD || '',
captchaVerification: '',
rememberMe: true //
}

View File

@ -36,9 +36,9 @@
value-format="YYYY-MM-DD HH:mm:ss"
/>
</el-form-item>
<el-form-item label="审批结果" prop="result">
<el-form-item label="审批结果" prop="status">
<el-select
v-model="queryParams.result"
v-model="queryParams.status"
class="!w-240px"
clearable
placeholder="请选择审批结果"
@ -81,7 +81,7 @@
<ContentWrap>
<el-table v-loading="loading" :data="list">
<el-table-column align="center" label="申请编号" prop="id" />
<el-table-column align="center" label="状态" prop="result">
<el-table-column align="center" label="状态" prop="status">
<template #default="scope">
<dict-tag :type="DICT_TYPE.BPM_PROCESS_INSTANCE_STATUS" :value="scope.row.status" />
</template>

View File

@ -36,7 +36,7 @@
ref="permissionListRef"
:biz-id="contract.id!"
:biz-type="BizTypeEnum.CRM_CONTRACT"
:show-action="false"
:show-action="!permissionListRef?.isPool || false"
@quit-team="close"
/>
</el-tab-pane>

View File

@ -186,7 +186,7 @@ const getOrderCountTrendComparison = async (
dates.push(item.value.date)
if (series.length === 2) {
series[0].data.push(fenToYuan(item?.value?.orderPayPrice || 0)) //
series[1].data.push(fenToYuan(item?.value?.orderPayCount || 0)) //
series[1].data.push(item?.value?.orderPayCount || 0) //
} else {
series[0].data.push(fenToYuan(item?.reference?.orderPayPrice || 0)) //
series[1].data.push(fenToYuan(item?.value?.orderPayPrice || 0)) //

View File

@ -7,6 +7,7 @@
:model="formData"
:rules="formRules"
label-width="80px"
@keydown.enter.prevent="submitForm"
>
<el-form-item label="属性名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入名称" />

View File

@ -37,7 +37,7 @@
<el-table-column label="appId" align="center" prop="appId" width="180" />
<el-table-column label="服务器地址(URL)" align="center" prop="appId" width="360">
<template #default="scope">
{{ 'http://服务端地址/mp/open/' + scope.row.appId }}
{{ 'http://服务端地址/admin-api/mp/open/' + scope.row.appId }}
</template>
</el-table-column>
<el-table-column label="二维码" align="center" prop="qrCodeUrl">

View File

@ -80,7 +80,8 @@
:http-request="keyContentUpload"
>
<el-button type="primary">
<Icon icon="ep:upload" class="mr-5px" /> 点击上传
<Icon icon="ep:upload" class="mr-5px" />
点击上传
</el-button>
</el-upload>
</el-form-item>
@ -120,7 +121,8 @@
:http-request="privateKeyContentUpload"
>
<el-button type="primary">
<Icon icon="ep:upload" class="mr-5px" /> 点击上传
<Icon icon="ep:upload" class="mr-5px" />
点击上传
</el-button>
</el-upload>
</el-form-item>
@ -148,7 +150,8 @@
:http-request="privateCertContentUpload"
>
<el-button type="primary">
<Icon icon="ep:upload" class="mr-5px" /> 点击上传
<Icon icon="ep:upload" class="mr-5px" />
点击上传
</el-button>
</el-upload>
</el-form-item>
@ -310,7 +313,7 @@ const pemFileBeforeUpload = (file) => {
/**
* 读取 apiclient_key.pem privateKeyContent 字段
*/
const privateKeyContentUpload = (event) => {
const privateKeyContentUpload = async (event) => {
const readFile = new FileReader()
readFile.onload = (e: any) => {
formData.value.config.privateKeyContent = e.target.result
@ -321,7 +324,7 @@ const privateKeyContentUpload = (event) => {
/**
* 读取 apiclient_cert.pem privateCertContent 字段
*/
const privateCertContentUpload = (event) => {
const privateCertContentUpload = async (event) => {
const readFile = new FileReader()
readFile.onload = (e: any) => {
formData.value.config.privateCertContent = e.target.result
@ -332,7 +335,7 @@ const privateCertContentUpload = (event) => {
/**
* 读取 apiclient_cert.p12 keyContent 字段
*/
const keyContentUpload = (event) => {
const keyContentUpload = async (event) => {
const readFile = new FileReader()
readFile.onload = (e: any) => {
formData.value.config.keyContent = e.target.result.split(',')[1]

View File

@ -45,10 +45,17 @@
/>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery"> <Icon icon="ep:search" class="mr-5px" />搜索 </el-button>
<el-button @click="resetQuery"> <Icon icon="ep:refresh" class="mr-5px" />重置 </el-button>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" />
搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" />
重置
</el-button>
<el-button type="primary" plain @click="openForm('create')" v-hasPermi="['pay:app:create']">
<Icon icon="ep:plus" class="mr-5px" /> 新增
<Icon icon="ep:plus" class="mr-5px" />
新增
</el-button>
</el-form-item>
</el-form>
@ -70,12 +77,17 @@
</template>
</el-table-column>
<el-table-column label="支付宝配置" align="center">
<el-table-column :label="PayChannelEnum.ALIPAY_APP.name" align="center">
<el-table-column
:label="channel.name"
align="center"
v-for="channel in alipayChannels"
:key="channel.code"
>
<template #default="scope">
<el-button
type="success"
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_APP.code)"
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_APP.code)"
v-if="isChannelExists(scope.row.channelCodes, channel.code)"
@click="openChannelForm(scope.row, channel.code)"
circle
>
<Icon icon="ep:check" />
@ -84,87 +96,7 @@
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_APP.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.ALIPAY_PC.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_PC.code)"
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_PC.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_PC.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.ALIPAY_WAP.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_WAP.code)"
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_WAP.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_WAP.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.ALIPAY_QR.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_QR.code)"
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_QR.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_QR.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.ALIPAY_BAR.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.ALIPAY_BAR.code)"
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_BAR.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.ALIPAY_BAR.code)"
@click="openChannelForm(scope.row, channel.code)"
>
<Icon icon="ep:close" />
</el-button>
@ -172,13 +104,18 @@
</el-table-column>
</el-table-column>
<el-table-column label="微信配置" align="center">
<el-table-column :label="PayChannelEnum.WX_LITE.name" align="center">
<el-table-column
:label="channel.name"
align="center"
v-for="channel in wxChannels"
:key="channel.code"
>
<template #default="scope">
<el-button
type="success"
v-if="isChannelExists(scope.row.channelCodes, channel.code)"
@click="openChannelForm(scope.row, channel.code)"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_LITE.code)"
@click="openChannelForm(scope.row, PayChannelEnum.WX_LITE.code)"
>
<Icon icon="ep:check" />
</el-button>
@ -186,67 +123,7 @@
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.WX_LITE.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.WX_PUB.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_PUB.code)"
@click="openChannelForm(scope.row, PayChannelEnum.WX_PUB.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.WX_PUB.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.WX_APP.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_APP.code)"
@click="openChannelForm(scope.row, PayChannelEnum.WX_APP.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.WX_APP.code)"
>
<Icon icon="ep:close" />
</el-button>
</template>
</el-table-column>
<el-table-column :label="PayChannelEnum.WX_BAR.name" align="center">
<template #default="scope">
<el-button
type="success"
circle
v-if="isChannelExists(scope.row.channelCodes, PayChannelEnum.WX_BAR.code)"
@click="openChannelForm(scope.row, PayChannelEnum.WX_BAR.code)"
>
<Icon icon="ep:check" />
</el-button>
<el-button
v-else
type="danger"
circle
@click="openChannelForm(scope.row, PayChannelEnum.WX_BAR.code)"
@click="openChannelForm(scope.row, channel.code)"
>
<Icon icon="ep:close" />
</el-button>
@ -338,12 +215,11 @@
import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
import * as AppApi from '@/api/pay/app'
import AppForm from './components/AppForm.vue'
import { PayChannelEnum } from '@/utils/constants'
import { CommonStatusEnum, PayChannelEnum } from '@/utils/constants'
import AlipayChannelForm from './components/channel/AlipayChannelForm.vue'
import WeixinChannelForm from './components/channel/WeixinChannelForm.vue'
import MockChannelForm from './components/channel/MockChannelForm.vue'
import WalletChannelForm from './components/channel/WalletChannelForm.vue'
import { CommonStatusEnum } from '@/utils/constants'
defineOptions({ name: 'PayApp' })
@ -365,6 +241,23 @@ const queryParams = reactive({
})
const queryFormRef = ref() //
const alipayChannels = [
PayChannelEnum.ALIPAY_APP,
PayChannelEnum.ALIPAY_PC,
PayChannelEnum.ALIPAY_WAP,
PayChannelEnum.ALIPAY_QR,
PayChannelEnum.ALIPAY_BAR
]
const wxChannels = [
PayChannelEnum.WX_LITE,
PayChannelEnum.WX_PUB,
PayChannelEnum.WX_APP,
PayChannelEnum.WX_NATIVE,
PayChannelEnum.WX_WAP,
PayChannelEnum.WX_BAR,
]
/** 查询列表 */
const getList = async () => {
loading.value = true

View File

@ -147,7 +147,7 @@ const handlePay = (row: any) => {
name: 'PayCashier',
query: {
id: row.payOrderId,
returnUrl: encodeURIComponent('/pay/demo-order?id=' + row.id)
returnUrl: encodeURIComponent('/pay/demo/order?id=' + row.id)
}
})
}

3
types/env.d.ts vendored
View File

@ -14,6 +14,9 @@ interface ImportMetaEnv {
readonly VITE_DEV: string
readonly VITE_APP_CAPTCHA_ENABLE: string
readonly VITE_APP_TENANT_ENABLE: string
readonly VITE_APP_DEFAULT_LOGIN_TENANT: string
readonly VITE_APP_DEFAULT_LOGIN_USERNAME: string
readonly VITE_APP_DEFAULT_LOGIN_PASSWORD: string
readonly VITE_APP_DOCALERT_ENABLE: string
readonly VITE_BASE_URL: string
readonly VITE_UPLOAD_URL: string