From 98d4db97d3c21f9b31f978249c5572fdae948088 Mon Sep 17 00:00:00 2001 From: verou <857149855@qq.com> Date: 星期三, 09 四月 2025 13:21:22 +0800 Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop --- rsf-admin/src/page/task/TaskList.jsx | 33 ++-- rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java | 2 rsf-admin/src/page/task/TaskEdit.jsx | 238 ++++++++++++--------------------- rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java | 10 + rsf-admin/src/page/taskItem/TaskItemList.jsx | 8 rsf-admin/src/page/login/Login.jsx | 7 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java | 7 rsf-admin/src/page/purchase/PurchaseList.jsx | 2 rsf-admin/src/page/task/TaskPanel.jsx | 84 +---------- rsf-admin/src/App.jsx | 3 rsf-admin/src/page/task/index.jsx | 1 rsf-server/src/main/resources/application-dev.yml | 2 12 files changed, 145 insertions(+), 252 deletions(-) diff --git a/rsf-admin/src/App.jsx b/rsf-admin/src/App.jsx index 9efadba..f3fbe6b 100644 --- a/rsf-admin/src/App.jsx +++ b/rsf-admin/src/App.jsx @@ -60,9 +60,6 @@ getSystemInfo().then((data) => { localStorage.setItem("system", JSON.stringify(data)); }) - getSystemDicts().then(data => { - localStorage.setItem('sys_dicts', JSON.stringify(data)); - }) }, []); return ( diff --git a/rsf-admin/src/page/login/Login.jsx b/rsf-admin/src/page/login/Login.jsx index 536a6ad..186f09a 100644 --- a/rsf-admin/src/page/login/Login.jsx +++ b/rsf-admin/src/page/login/Login.jsx @@ -14,8 +14,10 @@ import { useTranslate, useLogin, + localStorageStore, useNotify, } from 'react-admin'; +import { getSystemDicts } from "@/api/auth"; import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form"; import ProviderChoices from "./ProviderChoices"; import Visibility from '@mui/icons-material/Visibility'; @@ -36,7 +38,7 @@ const username = watch('username'); const password = watch('password'); const tenantId = watch('tenantId'); - + useEffect(() => { if (tenantList.length > 0 && !tenantId) { const rememberTenantId = localStorage.getItem('remember_tenantId'); @@ -49,6 +51,9 @@ }, [tenantList, setValue]); const onSubmit = (data) => { + getSystemDicts().then(data => { + localStorage.setItem('sys_dicts', JSON.stringify(data)); + }) setLoading(true); login( data, diff --git a/rsf-admin/src/page/purchase/PurchaseList.jsx b/rsf-admin/src/page/purchase/PurchaseList.jsx index adc1921..ffdb648 100644 --- a/rsf-admin/src/page/purchase/PurchaseList.jsx +++ b/rsf-admin/src/page/purchase/PurchaseList.jsx @@ -123,7 +123,7 @@ <StyledDatagrid preferenceKey='purchase' bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} - rowClick={(id, resource, record) => false} + rowClick={'edit'} expand={() => <PurchasePanel />} expandSingle={true} omit={['id', 'createTime', 'createBy', 'memo']} diff --git a/rsf-admin/src/page/task/TaskEdit.jsx b/rsf-admin/src/page/task/TaskEdit.jsx index ab88ff1..bca87b3 100644 --- a/rsf-admin/src/page/task/TaskEdit.jsx +++ b/rsf-admin/src/page/task/TaskEdit.jsx @@ -2,180 +2,120 @@ import { Edit, SimpleForm, - FormDataConsumer, useTranslate, TextInput, NumberInput, - BooleanInput, - DateInput, - SelectInput, - ReferenceInput, - ReferenceArrayInput, - AutocompleteInput, SaveButton, Toolbar, - Labeled, - NumberField, - required, - useRecordContext, - DeleteButton, } from 'react-admin'; -import { useWatch, useFormContext } from "react-hook-form"; -import { Stack, Grid, Box, Typography } from '@mui/material'; +import { useWatch, useFormContext, useForm } from "react-hook-form"; +import { Stack, Grid, Box, Typography, Card } from '@mui/material'; import * as Common from '@/utils/common'; import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting'; import EditBaseAside from "../components/EditBaseAside"; import CustomerTopToolBar from "../components/EditTopToolBar"; -import MemoInput from "../components/MemoInput"; -import StatusSelectInput from "../components/StatusSelectInput"; +import TaskItemList from "./TaskItemList"; const FormToolbar = () => { const { getValues } = useFormContext(); - return ( - <Toolbar sx={{ justifyContent: 'space-between' }}> + <Toolbar sx={{ justifyContent: 'end' }}> <SaveButton /> - <DeleteButton mutationMode="optimistic" /> + {/* <DeleteButton mutationMode="optimistic" /> */} </Toolbar> ) } const TaskEdit = () => { const translate = useTranslate(); - return ( - <Edit - redirect="list" - mutationMode={EDIT_MODE} - actions={<CustomerTopToolBar />} - aside={<EditBaseAside />} - > - <SimpleForm - shouldUnregister - warnWhenUnsavedChanges - toolbar={<FormToolbar />} - mode="onTouched" - defaultValues={{}} - // validate={(values) => { }} + <> + <Edit + redirect="list" + mutationMode={EDIT_MODE} + actions={<CustomerTopToolBar />} + aside={<EditBaseAside />} > - <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> - <Grid item xs={12} md={8}> - <Typography variant="h6" gutterBottom> - {translate('common.edit.title.main')} - </Typography> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.taskCode" - source="taskCode" - parse={v => v} - autoFocus - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.taskStatus" - source="taskStatus" - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.taskType" - source="taskType" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.orgLoc" - source="orgLoc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.orgSite" - source="orgSite" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.targLoc" - source="targLoc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.targSite" - source="targSite" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.barcode" - source="barcode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.robotCode" - source="robotCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.exceStatus" - source="exceStatus" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.expDesc" - source="expDesc" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <NumberInput - label="table.field.task.sort" - source="sort" - /> - </Stack> - <Stack direction='row' gap={2}> - <TextInput - label="table.field.task.expCode" - source="expCode" - parse={v => v} - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.task.startTime" - source="startTime" - /> - </Stack> - <Stack direction='row' gap={2}> - <DateInput - label="table.field.task.endTime" - source="endTime" - /> - </Stack> - + <SimpleForm + shouldUnregister + warnWhenUnsavedChanges + toolbar={<FormToolbar />} + mode="onTouched" + defaultValues={{}} + > + <Grid container width={{ xs: '100%', xl: '80%' }} rowSpacing={3} columnSpacing={3}> + <Grid item xs={24} md={16}> + <Typography variant="h6" gutterBottom> + {translate('common.edit.title.main')} + </Typography> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.task.taskCode" + source="taskCode" + readOnly + parse={v => v} + autoFocus + /> + <TextInput + label="table.field.task.taskStatus" + readOnly + source="taskStatus$" + /> + <TextInput + label="table.field.task.taskType" + source="taskType$" + readOnly + /> + <TextInput + label="table.field.task.orgLoc" + source="orgLoc" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.targLoc" + source="targLoc" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.orgSite" + source="orgSite" + readOnly + parse={v => v} + /> + </Stack> + <Stack direction='row' gap={2}> + <TextInput + label="table.field.task.targSite" + source="targSite" + readOnly + parse={v => v} + /> + <TextInput + label="table.field.task.barcode" + source="barcode" + readOnly + parse={v => v} + /> + <NumberInput + label="table.field.task.sort" + source="sort" + /> + </Stack> + </Grid> </Grid> - <Grid item xs={12} md={4}> - <Typography variant="h6" gutterBottom> - {translate('common.edit.title.common')} - </Typography> - <StatusSelectInput /> - <Box mt="2em" /> - <MemoInput /> - </Grid> + </SimpleForm> + </Edit > + <Card sx={{ marginTop: '1em', }}> + <Grid item xs={24} md={16} sx={{ margin: '1em' }}> + <Typography variant="h6" gutterBottom > + {translate('common.edit.title.common')} + </Typography> + <TaskItemList /> </Grid> - </SimpleForm> - </Edit > + </Card> + </> ) } diff --git a/rsf-admin/src/page/task/TaskList.jsx b/rsf-admin/src/page/task/TaskList.jsx index 86afa4c..dc8eceb 100644 --- a/rsf-admin/src/page/task/TaskList.jsx +++ b/rsf-admin/src/page/task/TaskList.jsx @@ -18,6 +18,7 @@ useTranslate, useNotify, useRefresh, + useDataProvider, useListContext, FunctionField, TextField, @@ -36,7 +37,7 @@ DeleteButton, Button, } from 'react-admin'; -import { Box, Typography, Card, Stack } from '@mui/material'; +import { Box, Typography, Card, Stack, Drawer } from '@mui/material'; import { styled } from '@mui/material/styles'; import TaskCreate from "./TaskCreate"; import TaskPanel from "./TaskPanel"; @@ -62,14 +63,14 @@ '& .column-name': { }, '& .opt': { - width: 200 + width: 248 }, })); const filters = [ <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" alwaysOn />, - <DateInput label='common.time.before' source="timeEnd" alwaysOn />, + <DateInput label='common.time.after' source="timeStart" />, + <DateInput label='common.time.before' source="timeEnd" />, <TextInput source="taskCode" label="table.field.task.taskCode" />, <NumberInput source="taskStatus" label="table.field.task.taskStatus" />, <NumberInput source="taskType" label="table.field.task.taskType" />, @@ -101,7 +102,7 @@ const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); - + const [data, setData] = useState([]); return ( <Box display="flex"> <List @@ -120,16 +121,13 @@ actions={( <TopToolbar> <FilterButton /> - {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */} <SelectColumnsButton preferenceKey='task' /> - {/* <MyExportButton /> */} </TopToolbar> )} perPage={DEFAULT_PAGE_SIZE} > <StyledDatagrid preferenceKey='task' - // bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />} bulkActionButtons={ <> <BulkResortButton /> @@ -137,10 +135,10 @@ <BulkDeleteButton mutationMode={OPERATE_MODE} /> </> } - rowClick={(id, resource, record) => false} - expand={() => <TaskPanel />} + rowClick={'edit'} + expand={false} expandSingle={true} - omit={['id', 'createTime', 'createBy', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'sort']} + omit={['id', 'createTime', 'createBy', 'memo', 'robotCode', 'exceStatus', 'expDesc', 'expCode', 'status', 'sort']} > <NumberField source="id" /> <TextField source="taskCode" label="table.field.task.taskCode" /> @@ -156,18 +154,13 @@ <TextField source="expDesc" label="table.field.task.expDesc" /> <NumberField source="sort" label="table.field.task.sort" /> <TextField source="expCode" label="table.field.task.expCode" /> - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> + <TextField source="updateBy$" label="common.field.updateBy"/> + <TextField source="createBy$" label="common.field.createBy"/> <DateField source="updateTime" label="common.field.updateTime" showTime /> - <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> <DateField source="createTime" label="common.field.createTime" showTime /> - <BooleanField source="statusBool" label="common.field.status" sortable={false} /> + {/* <BooleanField source="statusBool" label="common.field.status" sortable={false} /> */} <TextField source="memo" label="common.field.memo" sortable={false} /> <WrapperField cellClassName="opt" label="common.field.opt"> - {/* <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} /> */} <DoneButton sx={{ padding: '1px', fontSize: '.75rem' }} ></DoneButton> <CancelButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} /> <SetTopButton sx={{ padding: '1px', fontSize: '.75rem' }} ></SetTopButton> @@ -185,6 +178,8 @@ } export default TaskList; + + /** * 瀹屾垚鎿嶄綔 * @returns diff --git a/rsf-admin/src/page/task/TaskPanel.jsx b/rsf-admin/src/page/task/TaskPanel.jsx index dd7db7f..a207d24 100644 --- a/rsf-admin/src/page/task/TaskPanel.jsx +++ b/rsf-admin/src/page/task/TaskPanel.jsx @@ -1,36 +1,15 @@ import React, { useState, useRef, useEffect, useMemo } from "react"; -import { Box, Card, CardContent, Grid, Typography, Tooltip } from '@mui/material'; +import { Box } from '@mui/material'; import { List, DatagridConfigurable, - SearchInput, - TopToolbar, - SelectColumnsButton, - EditButton, - FilterButton, - CreateButton, - ExportButton, - BulkDeleteButton, - WrapperField, useRecordContext, useTranslate, - useNotify, - useListContext, - FunctionField, TextField, NumberField, DateField, BooleanField, ReferenceField, - TextInput, - DateTimeInput, - DateInput, - SelectInput, - NumberInput, - ReferenceInput, - ReferenceArrayInput, - AutocompleteInput, - DeleteButton, } from 'react-admin'; import { styled } from '@mui/material/styles'; import PageDrawer from "../components/PageDrawer"; @@ -51,43 +30,15 @@ }, })); -const filters = [ - <SearchInput source="condition" alwaysOn />, - <DateInput label='common.time.after' source="timeStart" />, - <DateInput label='common.time.before' source="timeEnd" />, - <NumberInput source="taskId" label="table.field.taskItem.taskId" />, - <NumberInput source="orderId" label="table.field.taskItem.orderId" />, - <NumberInput source="orderType" label="table.field.taskItem.orderType" />, - <NumberInput source="orderItemId" label="table.field.taskItem.orderItemId" />, - <NumberInput source="matnrId" label="table.field.taskItem.matnrId" />, - <TextInput source="maktx" label="table.field.taskItem.maktx" />, - <TextInput source="matnrCode" label="table.field.taskItem.matnrCode" />, - <TextInput source="unit" label="table.field.taskItem.unit" />, - <NumberInput source="anfme" label="table.field.taskItem.anfme" />, - <TextInput source="batch" label="table.field.taskItem.batch" />, - <TextInput source="spec" label="table.field.taskItem.spec" />, - <TextInput source="model" label="table.field.taskItem.model" />, - <TextInput label="common.field.memo" source="memo" />, - <SelectInput - label="common.field.status" - source="status" - choices={[ - { id: '1', name: 'common.enums.statusTrue' }, - { id: '0', name: 'common.enums.statusFalse' }, - ]} - resettable - />, -] - const TaskPanel = () => { + const record = useRecordContext(); const translate = useTranslate(); const [createDialog, setCreateDialog] = useState(false); const [drawerVal, setDrawerVal] = useState(false); - return ( <> <Box display="flex"> - <List + <List resource="taskItem" sx={{ flexGrow: 1, transition: (theme) => @@ -96,22 +47,17 @@ }), marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0, }} + filter={{ taskId: record.id }} title={"menu.taskItem"} + pagination={false} empty={false} - filters={filters} - sort={{ field: "create_time", order: "desc" }} - actions={( - <TopToolbar> - <FilterButton /> - </TopToolbar> - )} - perPage={DEFAULT_PAGE_SIZE} + actions={false} > <StyledDatagrid preferenceKey='taskItem' bulkActionButtons={false} - rowClick={(id, resource, record) => false} - expandSingle={true} + rowClick={false} + expandSingle omit={['id', 'createTime', 'createBy', 'memo', 'taskId', 'orderId', 'orderItemId', 'matnrId']} > <NumberField source="id" /> @@ -127,24 +73,14 @@ <TextField source="batch" label="table.field.taskItem.batch" /> <TextField source="spec" label="table.field.taskItem.spec" /> <TextField source="model" label="table.field.taskItem.model" /> - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> + <TextField source="updateBy$" label="common.field.updateBy"/> + <TextField source="createBy$" label="common.field.createBy"/> <DateField source="updateTime" label="common.field.updateTime" showTime /> - <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}> - <TextField source="nickname" /> - </ReferenceField> <DateField source="createTime" label="common.field.createTime" showTime /> <BooleanField source="statusBool" label="common.field.status" sortable={false} /> <TextField source="memo" label="common.field.memo" sortable={false} /> </StyledDatagrid> </List> - <PageDrawer - title='TaskItem Detail' - drawerVal={drawerVal} - setDrawerVal={setDrawerVal} - > - </PageDrawer> </Box> </> ); diff --git a/rsf-admin/src/page/task/index.jsx b/rsf-admin/src/page/task/index.jsx index 85c3ffe..1a48e09 100644 --- a/rsf-admin/src/page/task/index.jsx +++ b/rsf-admin/src/page/task/index.jsx @@ -9,7 +9,6 @@ import TaskEdit from "./TaskEdit"; export default { - list: TaskList, edit: TaskEdit, show: ShowGuesser, diff --git a/rsf-admin/src/page/taskItem/TaskItemList.jsx b/rsf-admin/src/page/taskItem/TaskItemList.jsx index d146e6d..e137031 100644 --- a/rsf-admin/src/page/taskItem/TaskItemList.jsx +++ b/rsf-admin/src/page/taskItem/TaskItemList.jsx @@ -38,6 +38,8 @@ import MyField from "../components/MyField"; import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting'; import * as Common from '@/utils/common'; +import MyCreateButton from "../components/MyCreateButton"; +import TaskItemCreate from "../task/TaskItemCreate"; const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({ '& .css-1vooibu-MuiSvgIcon-root': { @@ -104,7 +106,7 @@ actions={( <TopToolbar> <FilterButton /> - {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */} + <MyCreateButton onClick={() => { setCreateDialog(true) }} /> <SelectColumnsButton preferenceKey='taskItem' /> {/* <MyExportButton /> */} </TopToolbar> @@ -132,7 +134,6 @@ <TextField source="batch" label="table.field.taskItem.batch" /> <TextField source="spec" label="table.field.taskItem.spec" /> <TextField source="model" label="table.field.taskItem.model" /> - <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}> <TextField source="nickname" /> </ReferenceField> @@ -145,6 +146,9 @@ <TextField source="memo" label="common.field.memo" sortable={false} /> </StyledDatagrid> </List> + <TaskItemCreate + open={createDialog} + setOpen={setCreateDialog} /> <PageDrawer title='TaskItem Detail' drawerVal={drawerVal} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java index 3b2dbe6..72da8c5 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java @@ -243,4 +243,14 @@ return mobileService.taskGetLocs(code); } + @ApiOperation("涓�閿敹璐�") + @PostMapping("/complete/{id}") + @PreAuthorize("hasAuthority('manager:asnOrder:update')") + public R completeOrder(@PathVariable Long id) { + if (Objects.isNull(id)) { + return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒"); + } + return mobileService.completeOrder(id, getLoginUserId()); + } + } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java index 7b624a4..a1c2e6f 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java @@ -57,4 +57,6 @@ R taskToStock(String code); R taskGetLocs(String code) throws Exception; + + R completeOrder(Long id, Long loginUserId); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java index ea767f7..ae44e15 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java @@ -317,7 +317,7 @@ // //鏃ュ織琛ㄦ搷浣� // operateOrderLogs(asnOrder); // } - return R.ok("鎿嶄綔鎴愬姛"); + return R.ok(asnOrder); } /** @@ -723,6 +723,11 @@ return R.ok(); } + @Override + public R completeOrder(Long id, Long loginUserId) { + return asnOrderMapper.completeOrder(id, loginUserId); + } + /** * 鑾峰彇ReceiptDetlsDtos */ diff --git a/rsf-server/src/main/resources/application-dev.yml b/rsf-server/src/main/resources/application-dev.yml index 1afc3c5..2fa0bcc 100644 --- a/rsf-server/src/main/resources/application-dev.yml +++ b/rsf-server/src/main/resources/application-dev.yml @@ -14,7 +14,7 @@ driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://47.76.147.249:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai # username: root -# url: jdbc:mysql://localhost:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai +# url: jdbc:mysql://192.168.4.24:3306/rsf?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai username: rsf password: 34821015 type: com.alibaba.druid.pool.DruidDataSource -- Gitblit v1.9.1