From e2294523ff4d5a77fea588788eb5f0132dc9018e Mon Sep 17 00:00:00 2001 From: chenxt <10125295+chen-xintao97@user.noreply.gitee.com> Date: Fri, 12 Dec 2025 18:57:50 +0800 Subject: [PATCH] 登录缓存 --- package.json | 2 +- src/components/Common/CommonComponent/index.js | 7 ++++--- src/mes/common/commonOperationBarComponent/MesToolbar.js | 38 +++++++++++++++++++++++++------------- src/mes/common/routerComponent/index.js | 2 +- src/mes/indexMes/index.js | 81 ++++++++++++++++++++++++++++++++++++++++++++------------------------------------- src/mes/login/index.js | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------- 6 files changed, 145 insertions(+), 94 deletions(-) diff --git a/package.json b/package.json index 0353b57..4f89c20 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "babel-runtime": "6.26.0", "classnames": "^2.2.6", "copy-to-clipboard": "^3.3.1", - "core-js": "2.5.7", + "core-js": "3.47.0", "dhtmlx-gantt": "^7.1.6", "dva": "^2.4.1", "dva-router-config": "^1.1.0", diff --git a/src/components/Common/CommonComponent/index.js b/src/components/Common/CommonComponent/index.js index 224f442..b7c378c 100644 --- a/src/components/Common/CommonComponent/index.js +++ b/src/components/Common/CommonComponent/index.js @@ -271,7 +271,7 @@ export default class CommonComponent extends Component { const { sOnChangeInstruct } = this.props.showConfig; const sInstruct = commonUtils.convertStrToObj(sOnChangeInstruct, {}); if (sInstruct.blur) { - this.props.app.globalFun.onSetMask(true); + this.props.app?.globalFun?.onSetMask(true); } } clearTimeout(this.leaveTimer); @@ -310,7 +310,7 @@ export default class CommonComponent extends Component { onBlurText = (event, timeout = 0) => { const currentValue = event?.target?.value; if (currentValue == this.lastValue) { - this.props.app.globalFun?.onSetMask(false); + this.props.app?.globalFun?.onSetMask(false); return; } if (this.onExecInstructSet('blur')) { @@ -1649,6 +1649,7 @@ export default class CommonComponent extends Component { if (this.props.bPassWord) { obj.type = 'password'; /* 文本密码类型 */ obj.autocomplete = 'off'; /* 禁止浏览器自动填充到表单 */ + obj.value = this.props.dataValue } /* 最大值最小值 */ if (typeof commonUtils.convertStrToNumber(this.max) === 'number' && commonUtils.convertStrToNumber(this.max) !== 0 && this.max.indexOf('.d') === -1 && this.max.indexOf('.i') === -1) { @@ -2958,10 +2959,10 @@ export default class CommonComponent extends Component { } /* 获取outformitem控件参数 */ const outFormItemProps = this.getOutFormItemProps(); + /* 获取fieldDecorator参数 */ const fieldDecoratorProps = this.getFieldDecoratorProps(); /* 通用组件(主表存在getFieldDecorator表单验证,而从表则不需要) */ - const commonAssembly = this.props.bNewForm ? innerInput: ( {viewInfo} diff --git a/src/mes/common/commonOperationBarComponent/MesToolbar.js b/src/mes/common/commonOperationBarComponent/MesToolbar.js index 7a65055..13143c7 100644 --- a/src/mes/common/commonOperationBarComponent/MesToolbar.js +++ b/src/mes/common/commonOperationBarComponent/MesToolbar.js @@ -1,3 +1,4 @@ +/* eslint-disable */ import { message } from "antd"; import * as commonUtils from "@/utils/utils"; @@ -46,21 +47,32 @@ const handleAdd = (props) => { return result; }, []); - const menu = menuList.find(item => item.sId === sActiveId); - if (!menu) { - message.error('弹窗界面不在MES菜单中'); - return; - } - - app.globalFun.onChangeRouter({ - type: "id", - path: [menu.sParentId, menu.sId], - sModelType: menu.sName, - // sParentConditions, - copyTo: { - master: { maxBillNo: 'sBillNo' } + // const menu = menuList.find(item => item.sId === sActiveId); + // if (!menu) { + // message.error('弹窗界面不在MES菜单中'); + // return; + // } + props.onOpenCommonModal({ + type: "commonModal", + sActiveId, + title: props?.btnConfig?.showName, + parentProps: props, + onOk: data => { + window.debugger && console.log("=====onOk", data); + }, + onCancel: () => { + window.debugger && console.log("=====onCancel"); } }); + // app.globalFun.onChangeRouter({ + // type: "id", + // path: [menu.sParentId, menu.sId], + // sModelType: menu.sName, + // // sParentConditions, + // copyTo: { + // master: { maxBillNo: 'sBillNo' } + // } + // }); } // 保存 diff --git a/src/mes/common/routerComponent/index.js b/src/mes/common/routerComponent/index.js index 501dc60..168c473 100644 --- a/src/mes/common/routerComponent/index.js +++ b/src/mes/common/routerComponent/index.js @@ -66,7 +66,7 @@ const RouterComponent = props => { ); const selectedType = Object.keys(types).find(type => - sModelType.includes(type) + sModelType?.includes(type) ); if (selectedType) { diff --git a/src/mes/indexMes/index.js b/src/mes/indexMes/index.js index 30eaa9e..26e8cbb 100644 --- a/src/mes/indexMes/index.js +++ b/src/mes/indexMes/index.js @@ -103,12 +103,11 @@ const OpenModalEditPwd = props => { const oldPassword = commonFunc.showLocalMessage(props, 'oldPassword', '请输入原密码'); const newPassword = commonFunc.showLocalMessage(props, 'newPassword', '请输入新密码'); const passswordAgain = commonFunc.showLocalMessage(props, 'passswordAgain', '请再次输入密码'); - const ModifyPassword = commonFunc.showLocalMessage(props, 'ModifyPassword','修改密码');/* 修改 */ + const ModifyPassword = commonFunc.showLocalMessage(props, 'ModifyPassword', '修改密码');/* 修改 */ // 确认修改密码 const handleOk = () => { - const url = `${ - commonConfig.server_host - }sftlogininfo/updatePasswordUserName/update?sModelsId=${100}`; + const url = `${commonConfig.server_host + }sftlogininfo/updatePasswordUserName/update?sModelsId=${100}`; props.dispatch({ type: "app/editPwd", payload: { @@ -411,7 +410,6 @@ const IndexMes = baseProps => { const handleColseOee = () => { const { app, sModelsId } = props; const { sId } = app.userinfo; - const iPlcNo = commonUtils.isNotEmptyObject(app.iPlcNo) ? commonUtils.convertStrToNumber(app.iPlcNo) : 0; @@ -442,9 +440,8 @@ const IndexMes = baseProps => { token, sModelsId ) => { - const url = `${ - commonConfig.server_host - }procedureCall/doGenericProcedureCall?sModelsId=${sModelsId}`; + const url = `${commonConfig.server_host + }procedureCall/doGenericProcedureCall?sModelsId=${sModelsId}`; const returnData = (await commonServices.postValueService( token, value, @@ -461,16 +458,16 @@ const IndexMes = baseProps => { }; const currentLanguage = props?.app?.userinfo?.sLanguage || 'zhCN'; // 默认为中文 const getLocale = () => { - switch(currentLanguage) { + switch (currentLanguage) { case 'sEnglish': return enUS; case 'sBig5': return zhTW; default: - { - moment.locale('zh-cn'); - return zhCN; - } + { + moment.locale('zh-cn'); + return zhCN; + } } }; const bExsitLogin = commonFunc.showLocalMessage(props, 'bExsitLogin', '是否退出登录'); @@ -522,7 +519,7 @@ const HeaderConponent = () => { const { sUserNameBak: sUserName, sShift } = userinfo; const sLanguage = userinfo.sLanguage; let weekday = ["日", "一", "二", "三", "四", "五", "六"]; - const sunTitle = sLanguage ==='sChinese' ? '星期' : ''; + const sunTitle = sLanguage === 'sChinese' ? '星期' : ''; const [time, setTime] = useState("0000-00-00 00:00:00"); const { logout } = useContext(myContext); useEffect(() => { @@ -544,8 +541,8 @@ const HeaderConponent = () => { const logoTitle = commonFunc.showLocalMessage(props, 'EBC-MES', '小羚羊生产执行系统'); - const account= commonFunc.showLocalMessage(props, 'account', '账号'); - const machine= commonFunc.showLocalMessage(props, 'machine', '机台'); + const account = commonFunc.showLocalMessage(props, 'account', '账号'); + const machine = commonFunc.showLocalMessage(props, 'machine', '机台'); const classGroup = commonFunc.showLocalMessage(props, 'classGroup', '班组'); const dayShift = commonFunc.showLocalMessage(props, 'dayShift', '白班'); const nightShift = commonFunc.showLocalMessage(props, 'nightShift', '夜班'); @@ -628,19 +625,19 @@ const HeaderConponent = () => { // 左侧侧边栏 const SiderComponent = () => { const { dispatch, hooksProps, props, ...rest } = useContext(myContext); - const { currentContent, menuMap } = hooksProps; + const { currentContent, menuMap, menuMapOpposite } = hooksProps; - const teamInformation= commonFunc.showLocalMessage(props, 'teamInformation', '班组信息'); + const teamInformation = commonFunc.showLocalMessage(props, 'teamInformation', '班组信息'); - const scheduledTask= commonFunc.showLocalMessage(props, 'scheduledTask', '计划任务'); + const scheduledTask = commonFunc.showLocalMessage(props, 'scheduledTask', '计划任务'); - const productionExecution= commonFunc.showLocalMessage(props, 'productionExecution', '生产执行'); + const productionExecution = commonFunc.showLocalMessage(props, 'productionExecution', '生产执行'); - const maintenanceRepair= commonFunc.showLocalMessage(props, 'maintenanceRepair', '维修保养'); + const maintenanceRepair = commonFunc.showLocalMessage(props, 'maintenanceRepair', '维修保养'); - const queryTracing= commonFunc.showLocalMessage(props, 'queryTracing', '查询追踪'); + const queryTracing = commonFunc.showLocalMessage(props, 'queryTracing', '查询追踪'); - const operationGuide= commonFunc.showLocalMessage(props, 'teamInformation', '操作指南'); + const operationGuide = commonFunc.showLocalMessage(props, 'teamInformation', '操作指南'); const menuList = [ { @@ -686,12 +683,24 @@ const SiderComponent = () => { c_icon: c_guideIcon } ]; + const allowedIds = new Set(Object.values(menuMapOpposite)); + const filteredMenuList = [ + ...menuList.filter(item => allowedIds.has(item.id)), + { + id: "operationGuide", + title: operationGuide, + path: "/indexMes/operationGuide", + icon: guideIcon, + c_icon: c_guideIcon + } + ]; + console.log(filteredMenuList, 'menuList'); let [hoverState, setHoverState] = useState(null); return (
- {menuList.map(item => ( + {filteredMenuList.map(item => (
{ value.iFlag = iFlag; } - const url = `${ - commonConfig.server_host - }procedureCall/doGenericProcedureCall?sModelsId=${sModelsId}`; + const url = `${commonConfig.server_host + }procedureCall/doGenericProcedureCall?sModelsId=${sModelsId}`; const returnData = (await commonServices.postValueService( token, value, @@ -839,7 +847,7 @@ const SystemFunComponent = () => { onOk() { handleProcedureCall(params, 1); }, - onCancel() {} + onCancel() { } }); } else if (code === -8) { Modal.info({ @@ -896,9 +904,8 @@ const SystemFunComponent = () => { value.iFlag = iFlag; } - const url = `${ - commonConfig.server_host - }procedureCall/doGenericProcedureCall?sModelsId=${sModelsId}`; + const url = `${commonConfig.server_host + }procedureCall/doGenericProcedureCall?sModelsId=${sModelsId}`; const returnData = (await commonServices.postValueService( token, value, @@ -915,7 +922,7 @@ const SystemFunComponent = () => { onOk() { handleProcedureCall1(params, 1); }, - onCancel() {} + onCancel() { } }); } else if (code === -8) { Modal.info({ @@ -973,14 +980,14 @@ const SystemFunComponent = () => { const getSystemFunContent = () => { const userinfo = commonUtils.getAppData("userinfo"); - const ModifyPassword = commonFunc.showLocalMessage(props, 'ModifyPassword','修改密码');/* 修改密码 */ + const ModifyPassword = commonFunc.showLocalMessage(props, 'ModifyPassword', '修改密码');/* 修改密码 */ const faceCollection = commonFunc.showLocalMessage(props, 'faceCollection', '人脸采集'); const moreFunctions = commonFunc.showLocalMessage(props, 'moreFunctions', '更多功能'); const Logout = commonFunc.showLocalMessage(props, 'Logout', '退出登录'); - const shutDown= commonFunc.showLocalMessage(props, 'shutDown', '关机'); - const resetDailyReport= commonFunc.showLocalMessage(props, 'resetDailyReport', '关机'); - const switchToManual= commonFunc.showLocalMessage(props, 'switchToManual', '切换手动'); - const SwitchAuto= commonFunc.showLocalMessage(props, 'SwitchAuto', '切换自动'); + const shutDown = commonFunc.showLocalMessage(props, 'shutDown', '关机'); + const resetDailyReport = commonFunc.showLocalMessage(props, 'resetDailyReport', '关机'); + const switchToManual = commonFunc.showLocalMessage(props, 'switchToManual', '切换手动'); + const SwitchAuto = commonFunc.showLocalMessage(props, 'SwitchAuto', '切换自动'); const { bPlcSd } = userinfo; diff --git a/src/mes/login/index.js b/src/mes/login/index.js index 82add14..a8a83b5 100644 --- a/src/mes/login/index.js +++ b/src/mes/login/index.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, useMemo, useRef } from "react"; import { cloneDeep } from "lodash"; import { Form, Button, message } from "antd"; @@ -29,18 +29,20 @@ const useLoginEvent = props => { payload: {} }); sessionStorage.clear(); + // localStorage.clear(); + const masterValue = localStorage.getItem(`${commonConfig.prefix}masterData`); localStorage.clear(); + localStorage.setItem(`${commonConfig.prefix}masterData`, masterValue); + ipAddress && localStorage.setItem("ipAddress", ipAddress); tempFaceData && localStorage.setItem("tempFaceData", tempFaceData); }, []); - // 获取登录配置 const [loginConfig, setLoginConfig] = useState([]); useEffect(async () => { const { sModelsId } = initValue; - const configUrl = `${ - commonConfig.server_host - }business/getModelBysId/${sModelsId}?sModelsId=${sModelsId}&sName=/commonAuto`; + const configUrl = `${commonConfig.server_host + }business/getModelBysId/${sModelsId}?sModelsId=${sModelsId}&sName=/commonAuto`; const configReturn = (await commonServices.getService("", configUrl)).data; if (configReturn.code === 1) { const dataReturn = configReturn.dataset.rows; @@ -78,9 +80,8 @@ const useLoginEvent = props => { // 获取公司信息 useEffect(async () => { - const companysConfigUrl = `${ - commonConfig.server_host - }sysbrands/getSysbrands`; + const companysConfigUrl = `${commonConfig.server_host + }sysbrands/getSysbrands`; const companysConfigReturn = (await commonServices.getService( null, companysConfigUrl @@ -108,9 +109,8 @@ const useLoginEvent = props => { // 获取开工人员信息 const handleGetTeamEmployee = async (sTeamId, token) => { - const url = `${ - commonConfig.server_host - }oee/getTeamEmployee/${sTeamId}?sModelsId=100`; + const url = `${commonConfig.server_host + }oee/getTeamEmployee/${sTeamId}?sModelsId=100`; const dataReturn = (await commonServices.getService(token, url)).data; if (dataReturn.code === 1) { const returnData = dataReturn.dataset.rows; @@ -134,29 +134,42 @@ const useLoginEvent = props => { // 登录事件 const handleSubmit = async ({ faceLoginValue = {}, sEmployeeNo } = {}, configsData) => { const bFaceLogin = commonUtils.isNotEmptyObject(faceLoginValue); - + let masterNewData = {} let dataReturn = {}; if (!bFaceLogin) { // 账号密码登录 const { masterData, companys } = props; + const masterLocal = commonUtils.convertStrToObj( + localStorage.getItem(`${commonConfig.prefix}masterData`) + ) + if (masterLocal) { + masterNewData = { + ...masterLocal, + ...masterData, + } + }else { + masterNewData = { + ...masterData + } + } // 新增方法:根据sName过滤configs const getConfigByName = (name, configs, sLanguage) => { const configObj = configs?.find(item => item.sName === name) || {}; - const showName = sLanguage === 'sChinese' ? configObj.sChinese : sLanguage ==='sEnglish' ? configObj.sEnglish : + const showName = sLanguage === 'sChinese' ? configObj.sChinese : sLanguage === 'sEnglish' ? configObj.sEnglish : sLanguage === 'sBig5' ? configObj.sBig5 : configObj.sChinese; return showName; }; const sLanguage = commonUtils.isNotEmptyArr(companys) ? companys[0].sLanguage : 'sEnglish'; - const pleaseSelectUser = getConfigByName('pleaseSelectUser', configsData, sLanguage); + const pleaseSelectUser = getConfigByName('pleaseSelectUser', configsData, sLanguage); - const pleaseInputPassword = getConfigByName('pleaseInputPassword', configsData, sLanguage); + const pleaseInputPassword = getConfigByName('pleaseInputPassword', configsData, sLanguage); - const pleaseSelectTeam = getConfigByName('pleaseSelectTeam', configsData, sLanguage); + const pleaseSelectTeam = getConfigByName('pleaseSelectTeam', configsData, sLanguage); - const pleaseselectShift = getConfigByName('pleaseselectShift', configsData, sLanguage); + const pleaseselectShift = getConfigByName('pleaseselectShift', configsData, sLanguage); - const pleaseSelectMachine = getConfigByName('pleaseSelectMachine', configsData, sLanguage); + const pleaseSelectMachine = getConfigByName('pleaseSelectMachine', configsData, sLanguage); const { @@ -172,7 +185,7 @@ const useLoginEvent = props => { sMachineName, iPlcNo, sShift - } = masterData; + } = masterNewData; const value = { userId, @@ -215,17 +228,15 @@ const useLoginEvent = props => { return; } - const url = `${ - commonConfig.server_host - }userOeelogin/${sParentId}/${sId}/${sTeamId}/${sMachineId}`; + const url = `${commonConfig.server_host + }userOeelogin/${sParentId}/${sId}/${sTeamId}/${sMachineId}`; dataReturn = (await commonServices.postValueService(null, value, url)) .data; } else { // 人脸登录 const { sBrandsId, sSubsidiaryId, sEmployeeNo } = faceLoginValue; - const url = `${ - commonConfig.server_host - }userOeelogin/${sBrandsId}/${sSubsidiaryId}`; + const url = `${commonConfig.server_host + }userOeelogin/${sBrandsId}/${sSubsidiaryId}`; const value = { sEmployeeNo, sParentId: sBrandsId, sId: sSubsidiaryId }; dataReturn = (await commonServices.postValueService(null, value, url)) .data; @@ -306,6 +317,11 @@ const useLoginEvent = props => { `${commonConfig.prefix}statusData_${sMachineId}`, JSON.stringify(statusData) ); + const { masterData = {} } = props; + localStorage.setItem( + `${commonConfig.prefix}masterData`, + JSON.stringify(masterNewData) + ) handleUserlogin({ token, @@ -346,7 +362,7 @@ const useLoginEvent = props => { return { ...props, - companys, // 确保返回companys + companys, // 确保返回companys configs, onSubmit: handleSubmit, onFaceLogin: handleFaceLogin, @@ -359,9 +375,22 @@ const handleGetFormItem = (props, item) => { const { sModelsId } = initValue; const { masterData = {}, companys } = props; + + const userInfo = commonUtils.convertStrToObj( + localStorage.getItem(`${commonConfig.prefix}masterData`) + ); + let masterNewData = masterData + if (userInfo) { + masterNewData = { + ...userInfo, + ...masterData, + } + } + + const sLanguage = commonUtils.isNotEmptyArr(companys) && companys[0].sLanguage || 'sEnglish'; let enabledNew = true; - if(item.sName?.includes('please') || item.sName?.includes('请')) { + if (item.sName?.includes('please') || item.sName?.includes('请')) { return; } if (item.iTag === 1) { @@ -369,10 +398,11 @@ const handleGetFormItem = (props, item) => { } else if (item.iTag === 3) { enabledNew = true; } + const showTypeProps = { bNewForm: true, iColValue: 24, - record: masterData, + record: masterNewData, name: "master", formId: sModelsId, getSqlDropDownData: props.getSqlDropDownData, @@ -397,7 +427,7 @@ const handleGetFormItem = (props, item) => { formItemLayout: { labelCol: { span: 0 }, wrapperCol: { span: 24 } }, textArea: false, enabled: enabledNew, - dataValue: masterData[item.sName], + dataValue: masterNewData[item.sName], bTable: item.sName !== "sPassWord", bViewTable: true, onFilterDropDownData: props.onFilterDropDownData, @@ -405,7 +435,9 @@ const handleGetFormItem = (props, item) => { bPassWord: item.sName === "sPassWord", style: { backgroundColor: "#eaeaea" } }; - const showName = sLanguage === 'sChinese' ? item.sChinese : sLanguage ==='sEnglish' ? item.sEnglish + console.log(showTypeProps, 'showTypeProps'); + + const showName = sLanguage === 'sChinese' ? item.sChinese : sLanguage === 'sEnglish' ? item.sEnglish : item.sBig5; return ( @@ -417,9 +449,8 @@ const handleGetFormItem = (props, item) => { // 主入口 const login = baseProps => { const props = useLoginEvent(useCommonBase(baseProps)); - const { configs , app, companys } = props; - const sysObj = commonUtils.isNotEmptyArr(companys) ? companys[0] : []; - console.log('222', sysObj); + const { configs, app, companys } = props; + const sysObj = commonUtils.isNotEmptyArr(companys) ? companys[0] : []; const sLanguage = sysObj?.sLanguage || 'sEnglish'; const oeeTitle = @@ -464,7 +495,7 @@ const login = baseProps => { : sLanguage === "sEnglish" ? "Close" : "關 閉"; /* 关 闭 */ - const btnFace = sLanguage === "sChinese"? "人 脸 登 录" : sLanguage === "sEnglish" ? "FaceLogin" : "人 臉 登 錄"; /* 人 脸 */ + const btnFace = sLanguage === "sChinese" ? "人 脸 登 录" : sLanguage === "sEnglish" ? "FaceLogin" : "人 臉 登 錄"; /* 人 脸 */ const btnNormal = sLanguage === "sChinese" @@ -539,7 +570,7 @@ const FaceLoginModal = props => { if (!faceLoginModalVisible) return ""; const { companys } = props; const sLanguage = commonUtils.isNotEmptyArr(companys) ? companys[0].sLanguage : 'English'; - const btnFace = sLanguage === "sChinese"? "人 脸 登 录" : sLanguage === "sEnglish" ? "FaceLogin" : "人 臉 登 錄"; /* 人 脸 */ + const btnFace = sLanguage === "sChinese" ? "人 脸 登 录" : sLanguage === "sEnglish" ? "FaceLogin" : "人 臉 登 錄"; /* 人 脸 */ return ( { // 人脸弹窗后选择其他内容 const FaceLoginAfterModal = props => { - const { faceLoginAfterModalVisible , companys } = props; + const { faceLoginAfterModalVisible, companys } = props; if (!faceLoginAfterModalVisible) return ""; const sLanguage = commonUtils.isNotEmptyArr(companys) ? companys[0].sLanguage : 'English'; - const sLoginConfirm = sLanguage === "sChinese"? "登陆信息确认" : sLanguage === "sEnglish" ? "Login Information Confirmation" : "登陸信息確認"; /* 人 脸 */ - const btnConfirm = sLanguage === "sChinese"? "确认" : sLanguage === "sEnglish" ? "Confirm" : "確認"; /* 人 脸 */ - const btnCancel = sLanguage === "sChinese"? "取消" : sLanguage === "sEnglish" ? "Cancel" : "取消"; /* 取消 */ + const sLoginConfirm = sLanguage === "sChinese" ? "登陆信息确认" : sLanguage === "sEnglish" ? "Login Information Confirmation" : "登陸信息確認"; /* 人 脸 */ + const btnConfirm = sLanguage === "sChinese" ? "确认" : sLanguage === "sEnglish" ? "Confirm" : "確認"; /* 人 脸 */ + const btnCancel = sLanguage === "sChinese" ? "取消" : sLanguage === "sEnglish" ? "Cancel" : "取消"; /* 取消 */ const { -- libgit2 0.22.2