折扣价和折扣实时转换

背景 : react 项目
问题 : 在折扣数中输入折扣2.333333,中间会多很多0,输入2.222,不能正常输入到第三位

如下图


原因 : toFixed()数字转字符串时可能会导致精度问题 
解决思路 : parseFloat来解析浮点数,Number.isFinite判断给定的值是否为有限数值
原代码

  const calculateDiscountVal = (price, vip_price) => {
    if (Number(price) > 0 && Number(vip_price) > 0) {
      return (Number(vip_price) / Number(price)).toFixed(2) * 10;
    } else {
      return 0;
    }
  };

  const updateVipPriceFromDiscountRate = (price, discountRate) => {
    if (Number(price) > 0 && Number(discountRate) >= 0 && Number(discountRate) <= 10) {
      const vip_price = price * (discountRate / 10).toFixed(2);
      form.setFieldsValue({ vip_price: vip_price });
    }
  };

  useEffect(() => {
    // 只在零售价改变时更新折扣率
    let price = form.getFieldValue('price');
    let vip_price = form.getFieldValue('vip_price');
    setDiscountVal(calculateDiscountVal(price, vip_price));
  }, [form.getFieldValue('price'), form.getFieldValue('vip_price')]);

  // 问题:输入3.3折后,输入框变成3.30000 ; 原因:toFixed()数字转字符串时可能会导致精度问题 ; 解决:parseFloat来解析浮点数
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      setDiscountVal(newVal);
      const price = form.getFieldValue('price');
      updateVipPriceFromDiscountRate(price, newVal);
    }
  };



  return (
   <Form >
     <Form.Item label='零售价(元):' name='price'>
              <Input
                value={price}
                onChange={(e) => setprice(e.target.value)}
                autoComplete='off'
                allowClear
                style={{ width: 80 }}
              ></Input>
            </Form.Item>
            <Form.Item label='折扣价(元):'>
              <Form.Item name='vip_price' style={{ display: 'inline-block' }}>
                <Input
                  value={vip_price}
                  onChange={(e) => setvip_price(e.target.value)}
                  autoComplete='off'
                  allowClear
                  style={{ width: 80 }}
                ></Input>
              </Form.Item>
              <Form.Item style={{ display: 'inline-block', margin: '0 8px' }}>
                <Input
                  value={discountVal}
                  allowClear
                  onChange={handleDiscountRateChange}
                  autoComplete='off'
                  style={{ width: 80 }}
                ></Input>
                &nbsp;&nbsp;折
              </Form.Item>
            </Form.Item>
          </>
        )}

        <Form.Item wrapperCol={{ offset: 2 }}>
          <Space className='footer' size={20}>
            <Button
              onClick={() => {
                navigate(-1);
              }}
            >
              取消
            </Button>
            <Button type='primary' htmlType='submit'>
              确认
            </Button>
          </Space>
        </Form.Item>
  <<Form />

解决方法 1 :  上述其他代码不变 , 只在handleDiscountRateChange中加入parseFloat , 不可行 , 还会出现NaN , 如图

   // 在onChange中用parseFloat来解析浮点数,输入折扣数后,就触发折扣价改变,发现还是不太行,因为浮点数的精度问题可能会导致在 onChange 事件中出现意外行为。目前会更报错出现NaN,当在用户输入小数点和小数部分时,浮点数可能会被不完整地解析,导致计算错误,出现NaN
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      const roundedVal = parseFloat(newVal).toFixed(2); // 对输入的值进行四舍五入处理
      setDiscountVal(roundedVal);

      const price = form.getFieldValue('price');

      // 添加计算并更新折扣金额的逻辑
      if (Number(price) > 0) {
        const vip_price = price * (roundedVal / 10);
        form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
      }
    }
  };

最终解决方案 : 将parseFloat放在失去焦点(onBlur)中处理,更靠谱 , 如图

 

  // 将parseFloat放在失去焦点(onBlur)中处理,更靠谱
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      // 不在这里进行四舍五入处理,而是在失去焦点时处理
      setDiscountVal(newVal);
    }
  };

  const handleDiscountRateBlur = () => {
    const newVal = parseFloat(discountVal);
    if (Number.isFinite(newVal) && newVal >= 0 && newVal <= 10) {
      const roundedVal = newVal.toFixed(2);
      setDiscountVal(roundedVal);
      const price = form.getFieldValue('price');

      // 添加计算并更新折扣元的逻辑
      if (Number(price) > 0) {
        const vip_price = price * (roundedVal / 10);
        form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
      }
    }
  };


  <Form.Item style={{ display: 'inline-block', margin: '0 8px' }}>
                <Input
                  value={discountVal}
                  allowClear
                  onChange={handleDiscountRateChange}
                  onBlur={handleDiscountRateBlur} // 添加失去焦点事件处理函数
                  autoComplete='off'
                  style={{ width: 80 }}
                ></Input>
                &nbsp;&nbsp;折
   </Form.Item>

----------------------上述原代码不完整,以提供思路解决完问题为主,以下是完整的代码---------------------

import React, { useEffect, useState, useRef } from 'react';
import {
  Form,
  Input,
  Select,
  Button,
  Radio,
  Space,
  Image,
  Spin,
  Tree,
  Drawer,
  Row,
  Col,
} from 'antd';
import { getInfoById, publisherList, publisherAdd, getListAll, editBook } from './request';
import { getList } from '../classify/request';
import { useLocation } from 'react-router-dom';
import { useNavigate } from 'react-router-dom';
import { convertToAntdTreeData } from '@/utils/common.js';
const SaleEdit = () => {
  const {
    state: { id },
  } = useLocation();
  const [initialValues, setinitialValues] = useState({
    name: '',
    authors: '',
    category_id: null,
    producers_id: null,
    press_id: null,
    is_free: null,
  });
  const [form] = Form.useForm();
  const navigate = useNavigate();
  const [showAddCategory, setShowAddCategory] = useState(false); //弹出添加出品方
  const [showAddCategory1, setShowAddCategory1] = useState(false);
  const [showDrawer, setShowDrawer] = useState(false);
  const [publisher_name, setPublisherName] = useState(''); //出品方
  const [publishers, setPublishers] = useState([]);
  const [publisher_name1, setPublisherName1] = useState(''); //出版社
  const [publishers1, setPublishers1] = useState([]);
  const [treeData, setTreeData] = useState([]);

  // 在组件中添加一个状态来保存书籍类型的值
  const [bookType, setBookType] = useState(0); // 默认值为免费
  const [producersConfig, setproducersConfig] = useState({
    validateStatus: '',
    help: '',
    noStyle: false,
    style: {},
  });
  const [pressConfig, setpressConfig] = useState({
    validateStatus: '',
    help: '',
    noStyle: false,
    style: {},
  });
  const addproducers = async (obj, callbackFn) => {
    const { types } = obj;
    let flag = true;
    if (types == 1) {
      if (!publisher_name) {
        flag = false;
        setproducersConfig({
          ...producersConfig,
          validateStatus: 'error',
          help: '请输入新的出品方',
          noStyle: false,
        });
      }
    } else if (types == 2) {
      if (!publisher_name1) {
        flag = false;
        setpressConfig({
          ...pressConfig,
          validateStatus: 'error',
          help: '请输入新的出版社',
          noStyle: false,
        });
      }
    }
    if (!flag) return;
    // 上面代码是校验
    const bool = await publisherAdd(obj);
    if (!bool) return;
    callbackFn();
    setproducersConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
    setpressConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
    getProducers();
  };
  const [price, setprice] = useState(0);
  const [vip_price, setvip_price] = useState(0);
  const [discountVal, setDiscountVal] = useState(0);

  const calculateDiscountVal = (price, vip_price) => {
    if (Number(price) > 0 && Number(vip_price) > 0) {
      return (Number(vip_price) / Number(price)).toFixed(2) * 10;
    } else {
      return 0;
    }
  };

  const updateVipPriceFromDiscountRate = (price, discountRate) => {
    if (Number(price) > 0 && Number(discountRate) >= 0 && Number(discountRate) <= 10) {
      const vip_price = price * (discountRate / 10).toFixed(2);
      form.setFieldsValue({ vip_price: vip_price });
    }
  };

  useEffect(() => {
    // 只在零售价改变时更新折扣率
    let price = form.getFieldValue('price');
    let vip_price = form.getFieldValue('vip_price');
    setDiscountVal(calculateDiscountVal(price, vip_price));
  }, [form.getFieldValue('price'), form.getFieldValue('vip_price')]);

  // // 问题:输入3.3折后,输入框变成3.30000 ; 原因:toFixed()数字转字符串时可能会导致精度问题 ; 解决:parseFloat来解析浮点数
  // const handleDiscountRateChange = (ev) => {
  //   const newVal = ev.target.value;
  //   if (Number(newVal) >= 0 && Number(newVal) <= 10) {
  //     setDiscountVal(newVal);
  //     const price = form.getFieldValue('price');
  //     updateVipPriceFromDiscountRate(price, newVal);
  //   }
  // };

  // 在onChange中用parseFloat来解析浮点数,输入折扣数后,就触发折扣价改变,发现还是不太行,因为浮点数的精度问题可能会导致在 onChange 事件中出现意外行为。目前会更报错出现NaN,当在用户输入小数点和小数部分时,浮点数可能会被不完整地解析,导致计算错误,出现NaN
  // const handleDiscountRateChange = (ev) => {
  //   const newVal = ev.target.value;
  //   if (Number(newVal) >= 0 && Number(newVal) <= 10) {
  //     const roundedVal = parseFloat(newVal).toFixed(2); // 对输入的值进行四舍五入处理
  //     setDiscountVal(roundedVal);

  //     const price = form.getFieldValue('price');

  //     // 添加计算并更新折扣金额的逻辑
  //     if (Number(price) > 0) {
  //       const vip_price = price * (roundedVal / 10);
  //       form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
  //     }
  //   }
  // };

  // 将parseFloat放在失去焦点(onBlur)中处理,更靠谱
  const handleDiscountRateChange = (ev) => {
    const newVal = ev.target.value;
    if (Number(newVal) >= 0 && Number(newVal) <= 10) {
      // 不在这里进行四舍五入处理,而是在失去焦点时处理
      setDiscountVal(newVal);
    }
  };

  const handleDiscountRateBlur = () => {
    const newVal = parseFloat(discountVal);
    if (Number.isFinite(newVal) && newVal >= 0 && newVal <= 10) {
      const roundedVal = newVal.toFixed(2);
      setDiscountVal(roundedVal);
      const price = form.getFieldValue('price');

      // 添加计算并更新折扣元的逻辑
      if (Number(price) > 0) {
        const vip_price = price * (roundedVal / 10);
        form.setFieldsValue({ vip_price: vip_price.toFixed(2) });
      }
    }
  };

  useEffect(() => {
    if (!showAddCategory) {
      setPublisherName('');
    }
    if (!showAddCategory1) {
      setPublisherName1('');
    }
  }, [showAddCategory, showAddCategory1]);

  const handleOpenDrawer = async () => {
    setShowDrawer(true);
    const data = await getListAll({ book_id: id });
    let arr = convertToAntdTreeData(data, 'name');
    setTreeData(arr);
  };

  const handleCloseDrawer = () => {
    setShowDrawer(false);
  };
  const [classData, setClassData] = useState([]);
  const [producersData, setproducersData] = useState([]);
  const [pressData, setpressData] = useState([]);
  // 出品方/出版社
  const getProducers = async () => {
    const producersList = await publisherList({ types: 1 });
    const press = await publisherList({ types: 2 });
    setproducersData(producersList);
    setpressData(press);
  };
  const [FormLoad, setFormLoad] = useState(true);

  const [checkedKeys, setcheckedKeys] = useState([]);

  const submitTree = (obj) => {
    form.setFieldValue('trials', checkedKeys);
    handleCloseDrawer(false);
  };

  const ontreeCheck = (keys, { checked, checkedNodes, node, halfCheckedKeys }) => {
    setcheckedKeys(keys);
  };
  const getinfo = async () => {
    setFormLoad(true);
    // 详情
    const data = await getInfoById({ id });
    const { category_id, producers_id, press_id } = data;
    let obj = { category_id, producers_id, press_id };
    setBookType(data.is_free);
    for (let key in obj) {
      if (obj[key] === 0) {
        obj[key] = null;
      }
    }
    form.setFieldsValue({ ...data, ...obj });
    setFormLoad(false);
  };
  const getInfo = async () => {
    // 分类
    const { list } = await getList({ page: 1, page_size: 999 });
    setClassData(list);
    getProducers();
    getinfo();
  };
  const onFinish = async (obj) => {
    const bool = await editBook({ ...obj, id });
    if (!bool) return;
    navigate(-1);
  };
  useEffect(() => {
    getInfo();
  }, []);

  return (
    <Spin spinning={FormLoad} style={{ padding: 20 }}>
      <Form labelCol={{ span: 2 }} form={form} initialValues={initialValues} onFinish={onFinish}>
        <Form.Item label='书籍名称' name='name'>
          <Input
            disabled
            allowClear
            autoComplete='off'
            placeholder='请输入书籍名称'
            style={{ width: 400 }}
          ></Input>
        </Form.Item>
        <Form.Item label='书籍作者' name='authors'>
          <Input autoComplete='off' disabled style={{ width: 260 }}></Input>
        </Form.Item>
        <Form.Item
          label='分类'
          name='category_id'
          rules={[{ required: true, message: '请选择分类' }]}
        >
          <Select placeholder='请选择分类' style={{ width: 260 }}>
            {classData &&
              classData.map((item) => (
                <Select.Option value={item.id} key={item.id}>
                  {item.name}
                </Select.Option>
              ))}
          </Select>
        </Form.Item>
        <Form.Item label='出品方' required style={producersConfig.style}>
          <Space>
            <Form.Item
              noStyle
              name='producers_id'
              rules={[{ required: true, message: '请选择出品方' }]}
            >
              <Select placeholder='请选择出品方' style={{ width: 260 }}>
                {producersData?.map((item) => (
                  <Select.Option key={item.id} value={item.id}>
                    {item.publisher_name}
                  </Select.Option>
                ))}
              </Select>
            </Form.Item>
            <a
              style={{
                textDecoration: 'underline',
                color: '#1672EC',
                cursor: 'pointer',
              }}
              onClick={() => {
                setproducersConfig({ ...producersConfig, style: { marginBottom: 0 } });
                setShowAddCategory(true);
              }}
            >
              添加出品方
            </a>
          </Space>
          {showAddCategory && (
            <div style={{ marginTop: '10px' }}>
              <Space>
                <Form.Item
                  noStyle={producersConfig.noStyle}
                  validateStatus={producersConfig.validateStatus}
                  help={producersConfig.help}
                >
                  <Input
                    style={{ width: 260 }}
                    autoComplete='off'
                    placeholder='请输入新的出品方'
                    value={publisher_name}
                    allowClear
                    onChange={(e) => {
                      let val = e.target.value;
                      if (val) {
                        setproducersConfig({ ...producersConfig, help: '', validateStatus: '' });
                      }
                      setPublisherName(val);
                    }}
                  />
                </Form.Item>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#1672EC' }}
                  onClick={() =>
                    addproducers({ types: 1, publisher_name }, () => setShowAddCategory(false))
                  }
                >
                  添加
                </a>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#AA1941' }}
                  onClick={() => {
                    setproducersConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
                    setShowAddCategory(false); // 可选:添加后关闭输入框
                  }}
                >
                  删除
                </a>
              </Space>
            </div>
          )}
        </Form.Item>
        <Form.Item label='出版社' required style={pressConfig.style}>
          <Space>
            <Form.Item
              noStyle
              name='press_id'
              rules={[{ required: true, message: '请选择出版社' }]}
            >
              <Select placeholder='请选择出品方' style={{ width: 260 }}>
                {pressData?.map((item) => {
                  return (
                    <Select.Option key={item.id} value={item.id}>
                      {item.publisher_name}
                    </Select.Option>
                  );
                })}
              </Select>
            </Form.Item>
            <a
              style={{
                textDecoration: 'underline',
                color: '#1672EC',
                cursor: 'pointer',
              }}
              onClick={() => {
                setpressConfig({ ...pressConfig, style: { marginBottom: 0 } });
                setShowAddCategory1(true);
              }}
            >
              添加出版社
            </a>
          </Space>
          {showAddCategory1 && (
            <div style={{ marginTop: '10px' }}>
              <Space>
                <Form.Item
                  noStyle={pressConfig.noStyle}
                  validateStatus={pressConfig.validateStatus}
                  help={pressConfig.help}
                >
                  <Input
                    style={{ width: 260 }}
                    autoComplete='off'
                    placeholder='请输入新的出版社'
                    allowClear
                    value={publisher_name1}
                    onChange={(e) => {
                      let val = e.target.value;
                      if (val) {
                        setpressConfig({ ...pressConfig, help: '', validateStatus: '' });
                      }
                      setPublisherName1(e.target.value);
                    }}
                  />
                </Form.Item>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#1672EC' }}
                  onClick={() =>
                    addproducers({ types: 2, publisher_name: publisher_name1 }, () =>
                      setShowAddCategory1(false),
                    )
                  }
                >
                  添加
                </a>
                <a
                  type='link'
                  style={{ textDecoration: 'underline', color: '#AA1941' }}
                  onClick={() => {
                    setpressConfig({ validateStatus: '', help: '', noStyle: false, style: {} });
                    setShowAddCategory1(false);
                  }}
                >
                  删除
                </a>
              </Space>
            </div>
          )}
        </Form.Item>
        <Form.Item label='书籍类型' name='is_free'>
          <Radio.Group
            onChange={(e) => {
              setBookType(e.target.value);
            }}
          >
            <Radio value={1}>免费</Radio>
            <Radio value={0}>付费</Radio>
          </Radio.Group>
        </Form.Item>
        {bookType === 0 && (
          <Form.Item label='试读章节' name='trials'>
            <a type='link' style={{ textDecoration: 'underline' }} onClick={handleOpenDrawer}>
              选择试读章节
            </a>
          </Form.Item>
        )}

        {bookType === 0 && (
          <>
            <Form.Item label='零售价(元):' name='price'>
              <Input
                value={price}
                onChange={(e) => setprice(e.target.value)}
                autoComplete='off'
                allowClear
                style={{ width: 80 }}
              ></Input>
            </Form.Item>
            <Form.Item label='折扣价(元):'>
              <Form.Item name='vip_price' style={{ display: 'inline-block' }}>
                <Input
                  value={vip_price}
                  onChange={(e) => setvip_price(e.target.value)}
                  autoComplete='off'
                  allowClear
                  style={{ width: 80 }}
                ></Input>
              </Form.Item>
              <Form.Item style={{ display: 'inline-block', margin: '0 8px' }}>
                <Input
                  value={discountVal}
                  allowClear
                  onChange={handleDiscountRateChange}
                  onBlur={handleDiscountRateBlur} // 添加失去焦点事件处理函数
                  autoComplete='off'
                  style={{ width: 80 }}
                ></Input>
                &nbsp;&nbsp;折
              </Form.Item>
            </Form.Item>
          </>
        )}
        <Form.Item wrapperCol={{ offset: 2 }}>
          <Space className='footer' size={20}>
            <Button
              onClick={() => {
                navigate(-1);
              }}
            >
              取消
            </Button>
            <Button type='primary' htmlType='submit'>
              确认
            </Button>
          </Space>
        </Form.Item>
      </Form>

      <Drawer
        placement='right'
        onClose={handleCloseDrawer}
        open={showDrawer}
        labelCol={{ span: 7 }}
        mask={false}
      >
        <Form onFinish={submitTree}>
          <Form.Item name='power_list' style={{ padding: 10 }}>
            <Tree
              checkable
              checkedKeys={checkedKeys}
              defaultExpandAll={false} //让授权后的弹窗只展示根标签
              treeData={treeData}
              // showLine //删除这里,树形结构左侧的下拉线消失,图标从+-更改为默认的△
              // checkStrictly
              onCheck={ontreeCheck}
            />
          </Form.Item>
          <Form.Item wrapperCol={{ offset: 10, span: 16 }}>
            <Space size={20}>
              <Button className='cancel' onClick={() => handleCloseDrawer(false)}>
                取消
              </Button>
              <Button className='submit' htmlType='submit'>
                提交
              </Button>
            </Space>
          </Form.Item>
        </Form>
      </Drawer>
    </Spin>
  );
};

export default SaleEdit;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/451774.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

es 查询案例分析

场景描述&#xff1a; 有这样一种场景&#xff0c;比如我们想搜索 title&#xff1a;Brown fox body&#xff1a;Brown fox 文章索引中有两条数据&#xff0c;兔子和狐狸两条数据 PUT /blogs/_bulk {"index": {"_id": 1}} {"title": "…

DayDreamInGIS 之 ArcGIS Pro二次开发 锐角检查

功能&#xff1a;检查图斑中所有的夹角&#xff0c;如果为锐角&#xff0c;在单独的标记图层中标记。生成的结果放在默认gdb中&#xff0c;以 图层名_锐角检查 的方式命名 大体实现方式&#xff1a;遍历图层中的所有要素&#xff08;多部件要素分别处理&#xff09;&#xff0…

【C语言】qsort函数的使用

1.使用qsort函数排序整型数据 #include <stdio.h> #include <string.h> #include <stdlib.h>//void qsort(void* base, //指针&#xff0c;指向的是待排序的数组的第一个元素 // size_t num, //是base指向的待排序数组的元素个数 // siz…

力扣每日一题 在受污染的二叉树中查找元素 哈希 DFS 二进制

Problem: 1261. 在受污染的二叉树中查找元素 思路 &#x1f468;‍&#x1f3eb; 灵神题解 &#x1f496; 二进制 时间复杂度&#xff1a;初始化为 O ( 1 ) O(1) O(1)&#xff1b;find 为 O ( m i n ( h , l o g 2 t a r g e t ) O(min(h,log_2target) O(min(h,log2​targ…

Django 学习笔记(Day1)

「写在前面」 本文为千锋教育 Django 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。 目录 0 课程介绍 1 Django 快速入门 1.1 Django 介绍 1.2 Django 安装 1.3 创建 Django 项目 1.4 运行 Django 项目 1.5 数据迁…

【C#】.net core 6.0 使用第三方日志插件Log4net,日志输出到控制台或者文本文档

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握。…

【C++】stack/queue

链表完了之后就是我们的栈和队列了&#xff0c;当然我们的STL中也有实现&#xff0c;下面我们先来看一下简单用法&#xff0c;跟我们之前C语言实现的一样&#xff0c;stack和queue有这么几个重要的成员函数 最主要的就是这么几个&#xff1a;empty&#xff0c;push&#xff0c;…

python读取大型csv文件,降低内存占用,提高程序处理速度

文章目录 简介读取前多少行读取属性列逐块读取整个文件总结参考资料 简介 遇到大型的csv文件时&#xff0c;pandas会把该文件全部加载进内存&#xff0c;从而导致程序运行速度变慢。 本文提供了批量读取csv文件、读取属性列的方法&#xff0c;减轻内存占用情况。 import pand…

git commit --amend

git commit --amend 1. 修改已经输入的commit 1. 修改已经输入的commit 我已经输入了commit fix: 删除无用代码 然后现在表示不准确&#xff0c;然后我通过命令git commit --amend修改commit

鼓楼夜市管理wpf+sqlserver

鼓楼夜市管理系统wpfsqlserver 下载地址:鼓楼夜市管理系统wpfsqlserver 说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于C#wpf架构和sql server数据库 功能模块&#xff1a; 登录注册 鼓楼夜市管理系统主界面所有店铺信…

企业电子招投标系统源码-从源码到实践:深入了解鸿鹄电子招投标系统与电子招投标

在数字化采购领域&#xff0c;企业需要一个高效、透明和规范的管理系统。通过采用Spring Cloud、Spring Boot2、Mybatis等先进技术&#xff0c;我们打造了全过程数字化采购管理平台。该平台具备内外协同的能力&#xff0c;通过待办消息、招标公告、中标公告和信息发布等功能模块…

Tictoc3例子

在tictoc3中&#xff0c;实现了让 tic 和 toc 这两个简单模块之间传递消息&#xff0c;传递十次后结束仿真。 首先来介绍一下程序中用到的两个函数&#xff1a; 1.omnetpp中获取模块名称的函数 virtual const char *getName() const override {return name ? name : "&q…

Python 一步一步教你用pyglet制作汉诺塔游戏(终篇)

目录 汉诺塔游戏 完整游戏 后期展望 汉诺塔游戏 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候&#xff0c;他做了三根金刚石柱子&#xff0c;并在其中一根柱子上从下往上按照大小顺序摞…

js【详解】Promise

为什么需要使用 Promise &#xff1f; 传统回调函数的代码层层嵌套&#xff0c;形成回调地狱&#xff0c;难以阅读和维护&#xff0c;为了解决回调地狱的问题&#xff0c;诞生了 Promise 什么是 Promise &#xff1f; Promise 是一种异步编程的解决方案&#xff0c;本身是一个构…

套接字的地址结构,IP地址转换函数,网络编程的接口

目录 一、套接字的地址结构 1.1 通用socket地址结构 1.2 专用socket地址结构 1.2.1 tcp协议族 1.2.3 IP协议族 二、IP地址转换函数 三、网络编程接口 3.1 socket() 3.2 bind() 3.3 listen() 3.4 accept() 3.5 connect() 3.6 close() 3.7 recv()、send() 3.8 recv…

手写简易操作系统(五)--获得物理内存容量

前情提要 上一章中我们进入了保护模式&#xff0c;并且跳转到了32位模式下执行。这一章较为简单&#xff0c;我们来获取物理内存的实际容量。 一、获得内存容量的方式 在Linux中有多种方法获取内存容量&#xff0c;如果一种方法失败&#xff0c;就会试用其他方法。其本质上是…

考研数学|汤家凤《1800》vs 张宇《1000》,怎么选?

汤家凤的1800题和张宇的1000题都是备考数学考研的热门选择&#xff0c;但究竟哪个更适合备考呢&#xff1f;下面分享一些见解。 首先&#xff0c;让我们来看看传统习题册存在的一些问题。虽然传统习题册通常会覆盖考试的各个知识点和题型&#xff0c;但其中一些问题在于它们可…

JDBC连接MysqL

import java.sql.*;public class Demo {public static void main(String[] args) throws ClassNotFoundException, SQLException {//1.注册驱动&#xff0c;加载驱动&#xff1b;Class.forName("com.mysql.jdbc.Driver");//2.获得连接,返回connection类型的对象&…

汤唯短发造型:保留经典和适合自己的风格,也许才是最重要的

汤唯短发造型&#xff1a;保留经典和适合自己的风格&#xff0c;也许才是最重要的 汤唯短发造型登上Vogue四月刊封面&#xff0c;引发网友热议。#李秘书讲写作#说说是怎么回事&#xff1f; 这次Vogue四月刊的封面大片&#xff0c;汤唯以一头短发亮相&#xff0c;身穿五颜六色的…

钉钉平台“智”领宠物界,开启萌宠智能新时代!

在当前数字化转型的浪潮中&#xff0c;钉钉用便捷的数字化解决方案推动了宠物业界的智能升级。一家宠物用品公司采用无雀科技数字化管理系统&#xff0c;与钉钉平台结合&#xff0c;解决了小型企业普遍存在的财务管理不清晰、业务流程不规范、客户信息核对繁琐等痛点问题。 针对…