【Code】《代码整洁之道》笔记-附录B-org.jfree.date.SerialDate

UsageLog电脑使用记录软件 立即下载

附录B org.jfree.date.SerialDate

代码清单B-1 SerialDate.Java

   1 /* ========================================================================
   2  * JCommon : a free general purpose class library for the Java(tm) platform
   3  * ========================================================================
   4  *
   5  * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors.
   6  * 
   7  * 
   8  *
   9  * This library is free software; you can redistribute it and/or modify it 
  10  * under the terms of the GNU Lesser General Public License as published by 
  11  * the Free Software Foundation; either version 2.1 of the License, or 
  12  * (at your option) any later version.
  13  *
  14  * This library is distributed in the hope that it will be useful, but 
  15  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
  16  * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 
  17  * License for more details.
  18  *
  19  * You should have received a copy of the GNU Lesser General Public
  20  * License along with this library; if not, write to the Free Software
  21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
  22  * USA.
  23  *
  24  * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 
  25  * in the United States and other countries.]
  26  *
  27  * ---------------
  28  * SerialDate.java
  29  * ---------------
  30  * (C) Copyright 2001-2005, by Object Refinery Limited.
  31  *
  32  * Original Author:  David Gilbert (for Object Refinery Limited);
  33  * Contributor(s):   -;
  34  *
  35  * $Id: SerialDate.java,v 1.7 2005/11/03 09:25:17 mungady Exp $
  36  *
  37  * Changes (from 11-Oct-2001)
  38  * --------------------------
  39  * 11-Oct-2001 : Re-organised the class and moved it to new package 
  40  *               com.jrefinery.date (DG);
  41  * 05-Nov-2001 : Added a getDescription() method, and eliminated NotableDate 
  42  *               class (DG);
  43  * 12-Nov-2001 : IBD requires setDescription() method, now that NotableDate 
  44  *               class is gone (DG);  Changed getPreviousDayOfWeek(), 
  45  *               getFollowingDayOfWeek() and getNearestDayOfWeek() to correct 
  46  *               bugs (DG);
  47  * 05-Dec-2001 : Fixed bug in SpreadsheetDate class (DG);
  48  * 29-May-2002 : Moved the month constants into a separate interface 
  49  *               (MonthConstants) (DG);
  50  * 27-Aug-2002 : Fixed bug in addMonths() method, thanks to N???levka Petr (DG);
  51  * 03-Oct-2002 : Fixed errors reported by Checkstyle (DG);
  52  * 13-Mar-2003 : Implemented Serializable (DG);
  53  * 29-May-2003 : Fixed bug in addMonths method (DG);
  54  * 04-Sep-2003 : Implemented Comparable.  Updated the isInRange javadocs (DG);
  55  * 05-Jan-2005 : Fixed bug in addYears() method (1096282) (DG);
  56  * 
  57  */
  58 
  59 package org.jfree.date;
  60 
  61 import java.io.Serializable;
  62 import java.text.DateFormatSymbols;
  63 import java.text.SimpleDateFormat;
  64 import java.util.Calendar;
  65 import java.util.GregorianCalendar;
  66 
  67 /**
  68  * An abstract class that defines our requirements for manipulating dates,
  69  * without tying down a particular implementation.
  70  * <P>
  71  * Requirement 1 : match at least what Excel does for dates;
  72  * Requirement 2 : class is immutable;
  73  * <P>
  74  * Why not just use java.util.Date?  We will, when it makes sense.  At times,
  75  * java.util.Date can be *too* precise - it represents an instant in time,
  76  * accurate to 1/1000th of a second (with the date itself depending on the
  77  * time-zone).  Sometimes we just want to represent a particular day (e.g. 21
  78  * January 2015) without concerning ourselves about the time of day, or the
  79  * time-zone, or anything else.  That's what we've defined SerialDate for.
  80  * <P>
  81  * You can call getInstance() to get a concrete subclass of SerialDate,
  82  * without worrying about the exact implementation.
  83  *
  84  * @author David Gilbert
  85  */
  86 public abstract class SerialDate implements Comparable, 
  87                                             Serializable, 
  88                                             MonthConstants {
  89 
  90   /** For serialization. */
  91   private static final long serialVersionUID = -293716040467423637L;
  92
  93   /** Date format symbols. */
  94   public static final DateFormatSymbols
  95       DATE_FORMAT_SYMBOLS = new SimpleDateFormat().getDateFormatSymbols();
  96 
  97   /** The serial number for 1 January 1900. */
  98   public static final int SERIAL_LOWER_BOUND = 2;
  99 
 100   /** The serial number for 31 December 9999. */
 101   public static final int SERIAL_UPPER_BOUND = 2958465;
 102 
 103   /** The lowest year value supported by this date format. */
 104   public static final int MINIMUM_YEAR_SUPPORTED = 1900;
 105 
 106   /** The highest year value supported by this date format. */
 107   public static final int MAXIMUM_YEAR_SUPPORTED = 9999;
 108 
 109   /** Useful constant for Monday. Equivalent to java.util.Calendar.MONDAY. */
 110   public static final int MONDAY = Calendar.MONDAY;
 111 
 112   /** 
 113    * Useful constant for Tuesday. Equivalent to java.util.Calendar.TUESDAY. 
 114    */
 115   public static final int TUESDAY = Calendar.TUESDAY;
 116 
 117   /** 
 118    * Useful constant for Wednesday. Equivalent to 
 119    * java.util.Calendar.WEDNESDAY. 
 120    */
 121   public static final int WEDNESDAY = Calendar.WEDNESDAY;
 122 
 123   /** 
 124    * Useful constant for Thrusday. Equivalent to java.util.Calendar.THURSDAY. 
 125    */
 126   public static final int THURSDAY = Calendar.THURSDAY;
 127 
 128   /** Useful constant for Friday. Equivalent to java.util.Calendar.FRIDAY. */
 129   public static final int FRIDAY = Calendar.FRIDAY;
 130 
 131   /** 
 132    * Useful constant for Saturday. Equivalent to java.util.Calendar.SATURDAY.
 133    */
 134   public static final int SATURDAY = Calendar.SATURDAY;
 135 
 136   /** Useful constant for Sunday. Equivalent to java.util.Calendar.SUNDAY. */
 137   public static final int SUNDAY = Calendar.SUNDAY;
 138 
 139   /** The number of days in each month in non leap years. */
 140   static final int[] LAST_DAY_OF_MONTH =
 141       {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
 142 
 143   /** The number of days in a (non-leap) year up to the end of each month. */
 144   static final int[] AGGREGATE_DAYS_TO_END_OF_MONTH =
 145       {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
 146 
 147   /** The number of days in a year up to the end of the preceding month. */
 148   static final int[] AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH =
 149       {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
 150 
 151   /** The number of days in a leap year up to the end of each month. */
 152   static final int[] LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_MONTH =
 153       {0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
 154 
 155   /** 
 156    * The number of days in a leap year up to the end of the preceding month. 
 157    */
 158   static final int[] 
 159       LEAP_YEAR_AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH =
 160           {0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
 161 
 162   /** A useful constant for referring to the first week in a month. */
 163   public static final int FIRST_WEEK_IN_MONTH = 1;
 164 
 165   /** A useful constant for referring to the second week in a month. */
 166   public static final int SECOND_WEEK_IN_MONTH = 2;
 167 
 168   /** A useful constant for referring to the third week in a month. */
 169   public static final int THIRD_WEEK_IN_MONTH = 3;
 170 
 171   /** A useful constant for referring to the fourth week in a month. */
 172   public static final int FOURTH_WEEK_IN_MONTH = 4;
 173 
 174   /** A useful constant for referring to the last week in a month. */
 175   public static final int LAST_WEEK_IN_MONTH = 0;
 176 
 177   /** Useful range constant. */
 178   public static final int INCLUDE_NONE = 0;
 179 
 180   /** Useful range constant. */
 181   public static final int INCLUDE_FIRST = 1;
 182 
 183   /** Useful range constant. */
 184   public static final int INCLUDE_SECOND = 2;
 185 
 186   /** Useful range constant. */
 187   public static final int INCLUDE_BOTH = 3;
 188 
 189   /** 
 190    * Useful constant for specifying a day of the week relative to a fixed 
 191    * date. 
 192    */
 193   public static final int PRECEDING = -1;
 194 
 195   /** 
 196    * Useful constant for specifying a day of the week relative to a fixed 
 197    * date. 
 198    */
 199   public static final int NEAREST = 0;
 200 
 201   /** 
 202    * Useful constant for specifying a day of the week relative to a fixed 
 203    * date. 
 204    */
 205   public static final int FOLLOWING = 1;
 206 
 207   /** A description for the date. */
 208   private String description;
 209 
 210   /**
 211    * Default constructor.
 212    */
 213   protected SerialDate() {
 214   }
 215 
 216   /**
 217    * Returns <code>true</code> if the supplied integer code represents a 
 218    * valid day-of-the-week, and <code>false</code> otherwise.
 219    *
 220    * @param code  the code being checked for validity.
 221    *
 222    * @return <code>true</code> if the supplied integer code represents a 
 223    *         valid day-of-the-week, and <code>false</code> otherwise.
 224    */
 225   public static boolean isValidWeekdayCode(final int code) {
 226 
 227     switch(code) {
 228       case SUNDAY: 
 229       case MONDAY: 
 230       case TUESDAY: 
 231       case WEDNESDAY: 
 232       case THURSDAY: 
 233       case FRIDAY: 
 234       case SATURDAY: 
 235         return true;
 236       default: 
 237         return false;
 238     }
 239 
 240   }
 241 
 242   /**
 243    * Converts the supplied string to a day of the week.
 244    *
 245    * @param s  a string representing the day of the week.
 246    *
 247    * @return <code>-1</code> if the string is not convertable, the day of 
 248    *         the week otherwise.
 249    */
 250   public static int stringToWeekdayCode(String s) {
 251 
 252     final String[] shortWeekdayNames 
 253         = DATE_FORMAT_SYMBOLS.getShortWeekdays();
 254     final String[] weekDayNames = DATE_FORMAT_SYMBOLS.getWeekdays();
 255 
 256     int result = -1;
 257     s = s.trim();
 258     for (int i = 0; i < weekDayNames.length; i++) {
 259       if (s.equals(shortWeekdayNames[i])) {
 260         result = i;
 261         break;
 262       }
 263       if (s.equals(weekDayNames[i])) {
 264         result = i;
 265         break;
 266       }
 267     }
 268     return result;
 269 
 270   }
 271 
 272   /**
 273    * Returns a string representing the supplied day-of-the-week.
 274    * <P>
 275    * Need to find a better approach.
 276    *
 277    * @param weekday  the day of the week.
 278    *
 279    * @return a string representing the supplied day-of-the-week.
 280    */
 281   public static String weekdayCodeToString(final int weekday) {
 282 
 283       final String[] weekdays = DATE_FORMAT_SYMBOLS.getWeekdays();
 284       return weekdays[weekday];
 285 
 286   }
 287 
 288   /**
 289    * Returns an array of month names.
 290    *
 291    * @return an array of month names.
 292    */
 293   public static String[] getMonths() {
 294 
 295     return getMonths(false);
 296 
 297   }
 298 
 299   /**
 300    * Returns an array of month names.
 301    *
 302    * @param shortened  a flag indicating that shortened month names should 
 303    *                   be returned.
 304    *
 305    * @return an array of month names.
 306    */
 307   public static String[] getMonths(final boolean shortened) {
 308 
 309     if (shortened) {
 310       return DATE_FORMAT_SYMBOLS.getShortMonths();
 311     }
 312     else {
 313       return DATE_FORMAT_SYMBOLS.getMonths();
 314     }
 315 
 316   }
 317 
 318   /**
 319    * Returns true if the supplied integer code represents a valid month.
 320    *
 321    * @param code  the code being checked for validity.
 322    *
 323    * @return <code>true</code> if the supplied integer code represents a valid month.
 324    *         
 325    */
 326   public static boolean isValidMonthCode(final int code) {
 327 
 328     switch(code) {
 329       case JANUARY: 
 330       case FEBRUARY: 
 331       case MARCH: 
 332       case APRIL: 
 333       case MAY: 
 334       case JUNE: 
 335       case JULY: 
 336       case AUGUST: 
 337       case SEPTEMBER: 
 338       case OCTOBER: 
 339       case NOVEMBER: 
 340       case DECEMBER: 
 341         return true;
 342       default: 
 343         return false;
 344     }
 345 
 346   }
 347 
 348   /**
 349    * Returns the quarter for the specified month.
 350    *
 351    * @param code  the month code (1-12).
 352    *
 353    * @return the quarter that the month belongs to.
 354    * @throws java.lang.IllegalArgumentException
 355    */
 356   public static int monthCodeToQuarter(final int code) {
 357 
 358     switch(code) {
 359       case JANUARY: 
 360       case FEBRUARY: 
 361       case MARCH: return 1;
 362       case APRIL: 
 363       case MAY: 
 364       case JUNE: return 2;
 365       case JULY: 
 366       case AUGUST: 
 367       case SEPTEMBER: return 3;
 368       case OCTOBER: 
 369       case NOVEMBER: 
 370       case DECEMBER: return 4;
 371       default: throw new IllegalArgumentException(
 372         "SerialDate.monthCodeToQuarter: invalid month code.");
 373     }
 374 
 375   }
 376 
 377   /**
 378    * Returns a string representing the supplied month.
 379    * <P>
 380    * The string returned is the long form of the month name taken from the 
 381    * default locale.
 382    *
 383    * @param month  the month.
 384    *
 385    * @return a string representing the supplied month.
 386    */
 387   public static String monthCodeToString(final int month) {
 388 
 389     return monthCodeToString(month, false);
 390 
 391   }
 392 
 393   /**
 394    * Returns a string representing the supplied month.
 395    * <P>
 396    * The string returned is the long or short form of the month name taken 
 397    * from the default locale.
 398    *
 399    * @param month  the month.
 400    * @param shortened  if <code>true</code> return the abbreviation of the 
 401    *                   month.
 402    *
 403    * @return a string representing the supplied month.
 404    * @throws java.lang.IllegalArgumentException
 405    */
 406   public static String monthCodeToString(final int month, 
 407                                          final boolean shortened) {
 408 
 409     // check arguments...
 410     if (!isValidMonthCode(month)) {
 411       throw new IllegalArgumentException(
 412         "SerialDate.monthCodeToString: month outside valid range.");
 413     }
 414 
 415     final String[] months;
 416 
 417     if (shortened) {
 418       months = DATE_FORMAT_SYMBOLS.getShortMonths();
 419     }
 420     else {
 421         months = DATE_FORMAT_SYMBOLS.getMonths();
 422     }
 423 
 424     return months[month - 1];
 425 
 426   }
 427 
 428   /**
 429    * Converts a string to a month code.
 430    * <P>
 431    * This method will return one of the constants JANUARY, FEBRUARY, ..., 
 432    * DECEMBER that corresponds to the string.  If the string is not 
 433    * recognised, this method returns -1.
 434    *
 435    * @param s  the string to parse.
 436    *
 437    * @return <code>-1</code> if the string is not parseable, the month of the
 438    *         year otherwise.
 439    */
 440   public static int stringToMonthCode(String s) {
 441 
 442     final String[] shortMonthNames = DATE_FORMAT_SYMBOLS.getShortMonths();
 443     final String[] monthNames = DATE_FORMAT_SYMBOLS.getMonths();
 444 
 445     int result = -1;
 446     s = s.trim();
 447 
 448     // first try parsing the string as an integer (1-12)...
 449     try {
 450       result = Integer.parseInt(s);
 451     }
 452     catch (NumberFormatException e) {
 453       // suppress
 454     }
 455 
 456     // now search through the month names...
 457     if ((result < 1) || (result > 12)) {
 458       for (int i = 0; i < monthNames.length; i++) {
 459         if (s.equals(shortMonthNames[i])) {
 460           result = i + 1;
 461           break;
 462         }
 463         if (s.equals(monthNames[i])) {
 464           result = i + 1;
 465           break;
 466         }
 467       }
 468     }
 469 
 470     return result;
 471 
 472   }
 473 
 474   /**
 475    * Returns true if the supplied integer code represents a valid 
 476    * week-in-the-month, and false otherwise.
 477    *
 478    * @param code  the code being checked for validity.
 479    * @return <code>true</code> if the supplied integer code represents a 
 480    *         valid week-in-the-month.
 481    */
 482   public static boolean isValidWeekInMonthCode(final int code) {
 483 
 484     switch(code) {
 485       case FIRST_WEEK_IN_MONTH: 
 486       case SECOND_WEEK_IN_MONTH: 
 487       case THIRD_WEEK_IN_MONTH: 
 488       case FOURTH_WEEK_IN_MONTH: 
 489       case LAST_WEEK_IN_MONTH: return true;
 490       default: return false;
 491     }
 492 
 493   }
 494 
 495   /**
 496    * Determines whether or not the specified year is a leap year.
 497    *
 498    * @param yyyy  the year (in the range 1900 to 9999).
 499    *
 500    * @return <code>true</code> if the specified year is a leap year.
 501    */
 502   public static boolean isLeapYear(final int yyyy) {
 503 
 504     if ((yyyy % 4) != 0) {
 505       return false;
 506     }
 507     else if ((yyyy % 400) == 0) {
 508       return true;
 509     }
 510     else if ((yyyy % 100) == 0) {
 511       return false;
 512     }
 513     else {
 514       return true;
 515     }
 516 
 517   }
 518 
 519   /**
 520    * Returns the number of leap years from 1900 to the specified year 
 521    * INCLUSIVE.
 522    * <P>
 523    * Note that 1900 is not a leap year.
 524    *
 525    * @param yyyy  the year (in the range 1900 to 9999).
 526    *
 527    * @return the number of leap years from 1900 to the specified year.
 528    */
 529   public static int leapYearCount(final int yyyy) {
 530 
 531     final int leap4 = (yyyy - 1896) / 4;
 532     final int leap100 = (yyyy - 1800) / 100;
 533     final int leap400 = (yyyy - 1600) / 400;
 534     return leap4 - leap100 + leap400;
 535 
 536   }
 537 
 538   /**
 539    * Returns the number of the last day of the month, taking into account 
 540    * leap years.
 541    *
 542    * @param month  the month.
 543    * @param yyyy  the year (in the range 1900 to 9999).
 544    *
 545    * @return the number of the last day of the month.
 546    */
 547   public static int lastDayOfMonth(final int month, final int yyyy) {
 548 
 549     final int result = LAST_DAY_OF_MONTH[month];
 550     if (month != FEBRUARY) {
 551       return result;
 552     }
 553     else if (isLeapYear(yyyy)) {
 554       return result + 1;
 555     }
 556     else {
 557       return result;
 558     }
 559 
 560   }
 561 
 562   /**
 563    * Creates a new date by adding the specified number of days to the base 
 564    * date.
 565    *
 566    * @param days  the number of days to add (can be negative).
 567    * @param base  the base date.
 568    *
 569    * @return a new date.
 570    */
 571   public static SerialDate addDays(final int days, final SerialDate base) {
 572 
 573     final int serialDayNumber = base.toSerial() + days;
 574     return SerialDate.createInstance(serialDayNumber);
 575 
 576   }
 577 
 578   /**
 579    * Creates a new date by adding the specified number of months to the base 
 580    * date.
 581    * <P>
 582    * If the base date is close to the end of the month, the day on the result
 583    * may be adjusted slightly:  31 May + 1 month = 30 June.
 584    *
 585    * @param months  the number of months to add (can be negative).
 586    * @param base  the base date.
 587    *
 588    * @return a new date.
 589    */
 590   public static SerialDate addMonths(final int months, 
 591                                      final SerialDate base) {
 592 
 593     final int yy = (12 * base.getYYYY() + base.getMonth() + months - 1) / 12;
 594                    
 595     final int mm = (12 * base.getYYYY() + base.getMonth() + months - 1) % 12 + 1;
 596                    
 597     final int dd = Math.min(
 598         base.getDayOfMonth(), SerialDate.lastDayOfMonth(mm, yy)
 599     );
 600     return SerialDate.createInstance(dd, mm, yy);
 601 
 602   }
 603 
 604   /**
 605    * Creates a new date by adding the specified number of years to the base 
 606    * date.
 607    *
 608    * @param years  the number of years to add (can be negative).
 609    * @param base  the base date.
 610    *
 611    * @return A new date.
 612    */
 613   public static SerialDate addYears(final int years, final SerialDate base) {
 614 
 615     final int baseY = base.getYYYY();
 616     final int baseM = base.getMonth();
 617     final int baseD = base.getDayOfMonth();
 618 
 619     final int targetY = baseY + years;
 620     final int targetD = Math.min(
 621       baseD, SerialDate.lastDayOfMonth(baseM, targetY)
 622     );
 623 
 624     return SerialDate.createInstance(targetD, baseM, targetY);
 625 
 626   }
 627 
 628   /**
 629    * Returns the latest date that falls on the specified day-of-the-week and 
 630    * is BEFORE the base date.
 631    *
 632    * @param targetWeekday  a code for the target day-of-the-week.
 633    * @param base  the base date.
 634    *
 635    * @return the latest date that falls on the specified day-of-the-week and 
 636    *         is BEFORE the base date.
 637    */
 638   public static SerialDate getPreviousDayOfWeek(final int targetWeekday, 
 639                                                 final SerialDate base) {
 640 
 641     // check arguments...
 642     if (!SerialDate.isValidWeekdayCode(targetWeekday)) {
 643       throw new IllegalArgumentException(
 644           "Invalid day-of-the-week code."
 645       );
 646     }
 647 
 648     // find the date...
 649     final int adjust;
 650     final int baseDOW = base.getDayOfWeek();
 651     if (baseDOW > targetWeekday) {
 652       adjust = Math.min(0, targetWeekday - baseDOW);
 653     }
 654     else {
 655       adjust = -7 + Math.max(0, targetWeekday - baseDOW);
 656     }
 657 
 658     return SerialDate.addDays(adjust, base);
 659 
 660   }
 661 
 662   /**
 663    * Returns the earliest date that falls on the specified day-of-the-week
 664    * and is AFTER the base date.
 665    *
 666    * @param targetWeekday  a code for the target day-of-the-week.
 667    * @param base  the base date.
 668    *
 669    * @return the earliest date that falls on the specified day-of-the-week 
 670    *         and is AFTER the base date.
 671    */
 672   public static SerialDate getFollowingDayOfWeek(final int targetWeekday, 
 673                                                  final SerialDate base) {
 674 
 675     // check arguments...
 676     if (!SerialDate.isValidWeekdayCode(targetWeekday)) {
 677       throw new IllegalArgumentException(
 678           "Invalid day-of-the-week code."
 679       );
 680     }
 681 
 682     // find the date...
 683     final int adjust;
 684     final int baseDOW = base.getDayOfWeek();
 685     if (baseDOW > targetWeekday) {
 686       adjust = 7 + Math.min(0, targetWeekday - baseDOW);
 687     }
 688     else {
 689       adjust = Math.max(0, targetWeekday - baseDOW);
 690     }
 691 
 692     return SerialDate.addDays(adjust, base);
 693   }
 694 
 695   /**
 696    * Returns the date that falls on the specified day-of-the-week and is
 697    * CLOSEST to the base date.
 698    *
 699    * @param targetDOW  a code for the target day-of-the-week.
 700    * 
最新推荐-2026年固态电池+锂电正极+硅基负极等关键技术实践PPT合集(55份).zip 2026年最新固态电池+锂电正极+硅基负极等关键技术实践PPT合集,共55份。供大家查阅。 一、固态电池 1.全固态电池用硅基负极材料研究进展 2.全固态电池硅基负极的开发思考 3.功能型固态电解质设计及界面调控 4.固态电池及关键材料研发与产业化进展 5.固态电池的产业化应用探索 6.固态锂电池开发现状及未来展望 7.固态锂离子电池正极结构设计与材料选择 8.固态锂金属电池设计与应用 9.硫化物全固态电池石墨和硅负极性能调控技术 10.硫化物固态电解质行业应用 11.聚合物基固态电解质与固态电池的关键技术 12.蜂鸟声共振技术-固态电池产业化的革命性创新 13.长安汽车固态电池应用探索 14.高安全性固态电池技术发展趋势 15.高性能硫化物全固态锂电池解决方案 16.高硅体系的膨胀解决方案 二、硅基负极 1.化学气相沉积碳包覆技术在硅基负极材料中的应用 2.新型粘结剂解决 硅基负极膨胀问题 3.氧化亚硅负极材料化学预锂化与界面设计 4.流化床法生产磷酸铁锂及硅负极材料研究 5.石墨烯包覆硅碳负极 6.硅基材料的发展现状及展望 7.硅基负极与固态电解质 8.硅基负极技术与进展 9.硅基负极材料体积膨胀解决策略 10.硅基负极材料及其结构设计 11.硅基负极材料的冶金法制备 12.硅基负极材料的发展与应用 13.硅基负极材料研究进展 14.硅基负极材料:从基础研究到产业应用 15.硅基负极析锂行为及调制研究 16.硅碳负极低成本制造技术报告 17.硅碳负极制备用多孔碳的开发 18.硅碳负极挑战和进展 19.硅碳负极新路线及关键材料制备 20.硅碳负极锂离子电池应力特性研究 21.锂电石墨负极材料工程化技术进步 22.锂离子电池负极材料 23.高容量石墨烯-硅基复合负极材料的研究进展 三、锂电正极 1.基于AI和图论结构化学的锂电池的材料基因探索 2.废旧磷酸铁锂电池梯次及再生利用进展 3.电动汽车大功率充电标准体系与检测认证实践 4.磷酸铁及磷酸铁锂异物防控管理 5.磷酸铁锂正极材料:液相法合成及产业化应用研究 6.磷酸锰铁锂正极材料的研究现状 7.车用动力电池安全标准化工作进展及未来展望 8.锂电层状氧化物正极材料的原子尺度失效机制 9.锂电正极材料工厂异物防控管理图册 10.锂离子电池高熵正极材料成分设计及储锂机制研究 11.高压实磷酸铁锂正极材料生产工艺配方.docx 12.高安全正极材料添加剂提升三元锂电安全性 13.高比能富锂锰基电池关键技术 14.高能量密度锂离子电池正极材料及应用研究 15.高镍单晶三元正极材料研究 16.三元高电压单晶正极材料 立即下载

相关推荐

Zotero 是学术管理领域非常优秀的软件 它功能成熟、生态稳定,帮助许多科研人员建立了最初的文献归档体系

Zotero 是学术管理领域非常优秀的软件。它功能成熟、生态稳定,帮助许多科研人员建立了最初的文献归档体系。但在当下日常科研与深度使用各类 Agent 时,传统的文献工具链暴露出一些断点:上下文严重分散:论文存储在 Zotero,笔记记在 Obsidian,与模型的推导和分析留在各个网页对话框中。三者数据彼此隔离,当需要 Agent 结合某篇具体论文与历史笔记进行深入推导时,用户必须反复手动复制粘贴。文献格式对模型不友好:人类习惯阅读排版良好的 PDF 文件;但对于模型而言,直接解析双栏排版、跨页表格、复杂数学公式和交叉引用的成本极高,极易产生识别错误与幻觉。结构化 Markdown 与 LaTeX 才是模型容易准确理解的格式。维护成本较高:AI 伴读、全文翻译、笔记同步等高频需求,往往需要安装和调试多个社区插件,配置门槛高且在版本升级时容易出现兼容性问题。批量自动化能力有限:通过 Deep Research 或自动化检索工具发现的大量文献,目前仍需人工在浏览器中逐篇点击保存,难以顺畅衔接批量研究流。Agentero 并非旨在替代 Zotero,而是探索一种人与 Agent 协同处理科研上下文的新方式:人类负责:提出研究问题、进行学术价值判断、深度研读与核心结论推导;Agent 负责:批量检索筛选、元数据抓取、图表与公式提取、引用关系梳理及基础总结。

基于 .net 8、blazor 、furion 开发的后台管理系统,功能全(完善的用户权限管理、定时任务、附件管理、日志审计、物联网、企业门户等)、技术新

基于 .net 7开发的后台管理系统,系统前后台分离,api 是基于Furion 框架开发,前端是基于ant-design-blazor开发,系统使用技术或框架较新

SQLite Expert Professional v6.2.12.746 (x86 & x64) + License Key & Keygen.7z

SQLite Expert Professional v6.2.12.746 (x86 & x64) + License Key & Keygen.7z

材料科学基于电致塑性效应的多场耦合精密成形:难变形合金超薄带材低缺陷轧制工艺

内容概要:本文系统阐述了合金在电、热、力多场耦合作用下的电致塑性精密成形工艺(Electrically-Assisted Rolling, EAR),重点介绍其通过瞬时脉冲电流实现材料“成形时软、用时强”的核心技术原理。该工艺利用电子风力、焦耳热微区软化等非热与热效应协同作用,降低难变形合金的流动应力,提升单道次压下率(如SUS304由33.8%提升至41.5%),显著减少中间退火次数,实现数十微米级极薄带材的高效、低残余应力、高平整度轧制。文章详细分析了工艺参数(电流密度、频率、脉宽、温度窗口等)、装备配置(脉冲电源、绝缘辊系、在线检测)及失效模式控制,并强调需以“变形区有效电流密度”和“窄温区闭环控制”为核心进行工艺设计与优化。; 适合人群:从事金属材料加工、精密轧制、先进成形技术研发的科研人员与工程技术人员,具备材料科学与工程、机械制造或相关领域背景的研发工程师及研究生。; 使用场景及目标:①开发高强钛合金、不锈钢、特种合金等难变形金属的超薄精密箔材(如折叠屏基材、光刻机钢带);②优化现有冷轧工艺,降低能耗与退火次数,提升产品尺寸精度与表面质量;③研究电-热-力多场耦合成形机理,指导新型电辅助制造装备开发。; 阅读建议:本文兼具理论深度与工程实践指导意义,建议结合图表与实测数据理解多机制协同效应,重点关注电流回路设计、温度场闭环控制与参数标定方法,避免直接套用文献参数;在应用中应坚持“实验标定+仿真验证”原则,确保工艺安全性与可重复性。

电气工程基于电磁原理的继电器工作机理与应用:工业控制中强弱电隔离开关的设计选型及保护电路分析

内容概要:本文深入浅出地介绍了继电器的工作原理、核心结构、分类、常见应用场景及选型要点。继电器是一种利用小电流控制大电流的“自动开关”,通过线圈通电产生磁场,驱动衔铁吸合或释放,从而控制触点的通断。文章详细解析了其五大组成部分(线圈、铁芯、衔铁、弹簧、触点)和工作三步循环过程,强调了强弱电隔离的优势,并区分了常开、常闭和转换型触点的应用。同时,文章列举了继电器在工业控制、汽车电子、家用电器、新能源和电力系统中的典型应用,重点指出高压直流继电器在新能源汽车中的关键作用。针对选型,强调需根据负载类型(阻性、感性、容性)进行降额使用,并介绍续流二极管、RC吸收电路等保护措施以延长寿命。最后对比了电磁继电器与固态继电器的优缺点,帮助读者合理选择。; 适合人群:具备基础电工知识,从事电子、电气、自动化相关工作的技术人员或爱好者,以及工科类学生。; 使用场景及目标:①理解继电器在电路控制中的隔离与放大作用;②掌握继电器的选型方法与常见故障排查技巧;③应用于实际项目中如电机控制、电源管理、自动化系统设计等; 阅读建议:结合实物或电路图对照学习,重点关注触点保护与负载匹配部分,在实际应用中注意降额设计与环境因素影响。

智算中心AI大模型赋能智能体平台及AI场景应用规划方案(决策评审版).pptx

智算中心AI大模型赋能智能体平台及AI场景应用规划方案(决策评审版).pptx

企业数字化转型AI大模型赋能智能体平台及AI场景应用规划方案(专项申报版).pptx

企业数字化转型AI大模型赋能智能体平台及AI场景应用规划方案(专项申报版).pptx

Everything-v.1.4.1.1032 -X64-号称全世界查找文件最快的工具-便携版 .zip

Everything_v.1.4.1.1032 _X64_号称全世界查找文件最快的工具_便携版 .zip

基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究(Matlab代码实现)

内容概要:本文系统研究了基于序贯蒙特卡洛模拟法的配电网可靠性评估方法,重点在于通过Matlab编程实现对含分布式电源的配电网在多种运行条件下的可靠性量化分析。文章深入阐述了序贯蒙特卡洛模拟的核心原理,包括系统状态的时序抽样、状态转移机制以及故障与修复过程的随机建模,并构建了完整的仿真流程以计算系统平均停电频率(SAIFI)、系统平均停电持续时间(SAIDI)等关键可靠性指标。研究结合典型配电网络算例,验证了该方法在评估复杂电力系统可靠性方面的有效性与实用性,尤其分析了分布式电源接入对系统可靠性的影响机制,为现代配电网规划与运行提供了科学依据和技术支撑。; 适合人群:具备电力系统基础理论知识和一定Matlab编程能力的高校研究生、科研机构研究人员,以及从事配电网规划、运行与可靠性管理的工程技术人员。; 使用场景及目标:①深入掌握序贯蒙特卡洛模拟法在电力系统可靠性评估中的具体实施过程与技术细节;②学习并实践利用Matlab进行电力系统时序仿真与可靠性指标统计分析的方法;③探究分布式电源渗透对配电网整体可靠性水平的影响规律,为提升电网韧性提供决策参考; 阅读建议:读者应结合文中提供的Matlab代码实例进行实操演练,建议在理解算法逻辑的基础上,尝试修改系统参数、网络拓扑结构或调整分布式电源的配置方案,通过对比仿真结果加深对可靠性评估过程和影响因素的理解,该资源亦可直接应用于相关科研课题或工程项目的技术论证。

塔式熔盐光热朗肯循环电站建模!并且搭建了Simulink模型!!

内容概要:本文详细介绍了塔式熔盐光热朗肯循环电站的系统建模过程,并成功构建了相应的Simulink仿真模型。研究不仅涵盖电站热力循环的核心建模,还深入集成电力系统的关键环节,包括一次调频与二次调频控制、风光水火储多能互补的双目标动态调度、化学储能与超级电容混合储能系统的双层容量配置、风电功率波动的RLMD分解与平抑、综合能源系统多目标优化配置等关键技术。同时,文中应用了多种先进优化算法,如多目标粒子群算法(MOPSO)、基于核密度估计(KDE)的CDF置信带鲁棒调度方法等,形成了从系统建模、仿真到优化决策的完整技术链条,为新型电力系统的分析与设计提供了综合性解决方案。; 适合人群:具备电力系统、新能源科学、自动化控制、热能工程等相关专业背景,熟悉MATLAB/Simulink仿真平台,从事能源系统建模、优化调度、储能控制、电力电子与电网稳定性研究的科研人员、研究生及工程师。; 使用场景及目标:① 为塔式光热电站及综合能源系统相关的教学与科研工作提供详尽的Simulink建模范例与Matlab代码参考;② 实现对高比例新能源接入背景下电网的频率响应、动态调度、储能优化配置等问题的仿真分析与控制策略验证;③ 利用所提供的完整代码与模型,复现并深入研究多目标优化、鲁棒调度、信号分解等先进算法在复杂能源系统中的具体应用。; 阅读建议:此资源以实际工程项目为导向,深度融合了系统建模、仿真验证与优化算法三大核心环节。使用者应在深入理解文档中所涉基础理论(如朗肯循环原理、调频控制机制、SVPWM调制技术等)的基础上,结合所提供的Simulink模型与Matlab代码进行动手实践,通过调整系统参数、优化算法配置等方式,探究系统动态特性与优化机制。同时,强烈建议关注文末提供的完整资源下载链接,以获取全部配套的仿真文件、计算书及参考文献,确保学习的完整性与可复现性。

【DBO三维路径规划】基于多策略改进的蜣螂算法MSDBO多无人机协同集群避障路径规划(目标函数:最低成本:路径、高度、威胁、转角)研究(Matlab代码实现)

内容概要:本文研究基于多策略改进的蜣螂算法(MSDBO)在多无人机协同三维避障路径规划中的应用,旨在实现最低成本的路径规划,综合考虑路径长度、飞行高度、环境威胁和飞行转角等多个目标函数。通过Matlab代码实现算法仿真,优化无人机集群在复杂三维空间中的协同飞行路径,有效规避静态与动态障碍物,提升任务执行效率与飞行安全性。该方法融合智能优化算法与路径规划技术,针对城市空中交通、应急救援、军事侦察等实际场景需求,提出了高效的分布式协同求解框架,为多无人机系统在复杂环境下的自主导航与集群控制提供了理论依据和技术支撑。; 适合人群:具备一定编程基础和优化算法知识的科研人员、自动化与人工智能领域研究生、从事无人机路径规划或智能优化算法开发的工程师。; 使用场景及目标:①应用于多无人机协同执行任务时的三维路径规划与动态避障;②解决复杂环境中多目标优化路径问题,提升集群飞行的安全性与经济性;③为智能交通、灾害巡检、城市物流等场景提供可扩展的算法支持;④支持进一步研究算法在异构无人机集群、实时通信受限条件下的适应性改进。; 阅读建议:建议读者结合Matlab代码进行实践操作,深入理解蜣螂算法的改进策略及其在路径规划中的具体实现方式,同时可通过调整环境参数、障碍物分布及目标权重进行扩展性研究,探索算法在不同任务场景下的性能表现与优化潜力。

长沙创沅-硬盘检测-固态硬盘测速工具 .exe

长沙创沅_硬盘检测_固态硬盘测速工具 .exe

虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型(simulink仿真实现)

内容概要:本文详细介绍了基于Simulink的虚拟同步发电机(VSG)惯量阻尼自适应控制仿真模型,旨在通过先进的控制算法实现对VSG系统中虚拟惯量和阻尼系数的在线自适应调节,以增强新能源并网背景下电力系统的频率稳定性与动态响应能力。模型深度融合控制理论与系统仿真技术,构建了完整的VSG控制架构,重点设计并实现了能够根据系统功率波动和运行工况动态调整惯量与阻尼参数的自适应策略,有效提升了系统对扰动的抑制能力和运行鲁棒性。文中系统阐述了控制结构的设计原理、自适应算法的实现逻辑,并通过丰富的Simulink仿真实验验证了所提方法在不同工况下的优越性能和有效性。; 适合人群:具备电力系统分析、自动控制理论基础及Simulink仿真技能的电气工程、自动化等相关专业的硕士、博士研究生、科研人员,以及从事新能源发电、微电网、电力电子并网技术开发的工程师。; 使用场景及目标:①深入研究新能源高渗透率下电力系统的频率稳定控制机理与解决方案;②为虚拟同步发电机高级控制策略的研发、优化与性能验证提供一个可靠的仿真研究平台;③支撑高等院校在现代电力系统、可再生能源并网等课程中的实践教学与课题研究。; 阅读建议:建议读者结合提供的Simulink模型文件进行同步操作与参数调试,深入理解控制逻辑与各模块间的信号交互关系,同时鼓励修改系统参数、引入不同的扰动工况或尝试改进控制算法,以全面探究系统的动态响应特性和控制策略的适应性。

论文《基于物理信息神经网络的传热过程物理场代理模型的构建》Python torch复现

内容概要:本文详细阐述了对论文《基于物理信息神经网络的传热过程物理场代理模型的构建》的Python Torch复现工作,重点在于利用物理信息神经网络(PINN)构建传热过程的物理场代理模型。文中深入介绍了PINN的核心思想,即将物理定律(如传热偏微分方程)作为先验知识嵌入神经网络的损失函数中,使模型在训练过程中同时拟合观测数据并满足物理规律,从而提升模型在数据稀疏或边界条件复杂情况下的泛化能力和预测精度。复现内容涵盖了完整的模型架构设计、基于PyTorch的代码实现、物理约束的数学转化与损失函数构建、训练流程优化以及数值实验结果的可视化与分析,系统性地展示了如何将物理机理与深度学习技术深度融合以解决科学计算问题。; 适合人群:具备一定深度学习理论基础和PyTorch框架使用经验,同时拥有传热学或相关物理建模知识的研究生、科研人员,以及从事科学计算、工程仿真与数字孪生技术研发的工程师。; 使用场景及目标:① 深入理解物理信息神经网络(PINN)的理论基础及其在解决偏微分方程方面的创新应用;② 获取一个结构清晰、可复现的基于PyTorch的PINN求解传热问题的完整代码框架,用于验证论文结果或作为二次开发的基础;③ 探索如何将先验物理知识有效地融入机器学习模型,以解决传统数据驱动方法在物理场建模中因数据不足而导致的可靠性问题。; 阅读建议:在学习过程中应紧密结合代码,重点关注物理控制方程是如何被离散化并转化为可微分的损失项这一核心环节,建议通过调整网络结构、损失权重和边界条件等方式进行调试与实验,以深化对PINN工作机制和超参数敏感性的理解,同时推荐预先熟悉PyTorch的自动微分机制和偏微分方程的基本求解概念。

基于蜣螂优化算法的多无人机安全航迹规划方法研究(Matlab代码实现)

内容概要:本文研究了基于蜣螂优化算法的多无人机安全航迹规划方法,并提供了完整的Matlab代码实现。通过引入多策略改进的蜣螂优化算法(MSDBO),有效解决了多无人机在复杂城市环境中的协同避障与路径规划问题。研究综合考虑了路径长度、飞行高度、威胁规避、转弯成本等多项目标,构建了以最低综合成本为目标的优化模型,提升了无人机集群在执行任务时的安全性与效率。文中详细阐述了算法的数学建模过程、目标函数设计、约束条件处理及三维仿真环境的构建,并通过仿真实验验证了该方法相较于传统优化算法在收敛速度、路径质量与避障能力方面的优越性。; 适合人群:具备一定优化算法、无人机控制及Matlab编程基础,从事智能优化、路径规划、空中交通管理或群体智能系统研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于城市空中交通、灾害救援、军事侦察等复杂动态环境下的多无人机协同安全航迹规划;②为研究人员提供蜣螂优化算法在路径规划领域的一个完整、可复现的应用案例,推动仿生智能优化算法的理论发展与工程实践;③通过开放Matlab代码促进算法的快速复现、性能对比与进一步改进,支持后续在多智能体协同、动态障碍物处理等方面的扩展研究。; 阅读建议:建议读者结合文中提供的Matlab代码逐段理解算法实现细节,重点关注目标函数的加权设计逻辑、多约束条件的惩罚项处理方式以及改进策略(如精英反向学习、自适应权重)对算法性能的提升作用,同时可通过调整环境参数、威胁分布或引入动态障碍进行扩展实验,以深入掌握算法的适应性与鲁棒性。

具有PWM控制VSC-HVDC链路的IEEE30总线传输系统(Simulink仿真实现)

内容概要:本文详细介绍了基于PWM控制的VSC-HVDC(电压源换流器高压直流输电)链路在IEEE30总线电力系统中的Simulink仿真实现方法。研究围绕VSC-HVDC系统的建模、控制策略设计及其在复杂电网中的集成展开,重点阐述了系统拓扑结构、PWM调制技术、有功与无功功率的独立调节机制、动态响应特性以及系统稳定性分析等内容。通过在Simulink环境中构建完整的IEEE30节点系统模型,并嵌入VSC-HVDC链路,实现了对系统潮流的精确控制与优化,充分验证了该技术在提升电网灵活性、运行可靠性及输电效率方面的显著优势。; 适合人群:具备电力系统分析基础和Simulink/Matlab仿真能力的高校研究生、科研人员,以及从事新能源并网、柔性输电系统、高压直流输电工程设计等相关领域的工程技术人员。; 使用场景及目标:①用于教学与科研中深入理解VSC-HVDC的工作原理及其在大型电网中的实际应用;②支撑电力系统优化调度、柔性输电技术研究及新能源大规模接入方案的设计与仿真验证;③为相关课题提供可复现、可扩展的仿真模型与技术支持,促进研究成果的转化与落地。; 阅读建议:建议读者结合所提供的Simulink模型文件,按照文档结构循序渐进地学习,重点关注控制系统的设计逻辑、控制器参数整定方法及系统动态响应特性,并尝试调整运行条件与故障场景进行对比仿真,以深入掌握VSC-HVDC系统的控制机理与工程应用要点。

【5G】5G 核心网(5GC)基本架构

本文旨在科普5G核心网相关知识...

Learning makes me happy (0^◇^0) 4万+

WinCC ActiveX控件“许可证缺失”故障排查:从注册表修复到系统兼容性全解析

本文深入解析WinCC ActiveX控件报错“未找到许可证信息”的根本原因与解决方案。核心在于系统注册表中控件的设计时许可证密钥丢失或损坏。文章提供了从手动修复注册表、排查64位系统兼容性,到预防性环境部署的全流程专业指南,帮助工程师彻底解决这一常见故障。

oil88的博客 647

音频分割:长语音音频 分割为 短语音音频 - python 实现

音频分割:长语音音频 分割为 短语音音频 - python 实现

DATABALL 的博客 1207

行列式详解:从定义到应用

本文系统介绍了行列式的核心概念和应用。首先从二阶、三阶行列式入手,逐步扩展到n阶行列式的定义,讲解了余子式和代数余子式的概念。其次,详细阐述了行列式的重要性质,包括转置不变性、行列交换变号等基本性质以及乘积性质等推论。在计算方法方面,介绍了按行展开法、化上三角矩阵法等实用技巧,并列举了特殊行列式的计算案例。最后重点讨论了行列式在克拉默法则、矩阵可逆性判断、几何体积计算及线性相关性判断等领域的应用。文章强调理解行列式的几何意义和灵活运用性质的重要性,并给出了学习建议和常见误区提示。行列式作为连接代数与几何的桥

aichitang2024的博客 3037

001、Zephyr RTOS简介与历史背景

本文介绍了Zephyr RTOS的特点及其在嵌入式开发中的应用。作者通过亲身经历比较了Zephyr与传统RTOS的差异,重点分析了Zephyr的设备树、统一驱动模型、基于CMake的构建系统、POSIX兼容层等核心特性。文章详细阐述了Zephyr在内核设计上的优势,如中断处理模型、内存管理等,并提供了社区生态和使用建议。作者建议开发者从简单项目入手逐步掌握Zephyr,同时指出了常见的使用问题和适用场景,认为Zephyr特别适合复杂软件架构的物联网和工业控制项目。

m0_50546716的博客 155

危废焚烧优化控制系统设计与实现:基于数据驱动的控制参数预测

本文提出了一种基于数据驱动的危险废物焚烧过程优化控制方法。系统利用历史运行数据和实时监测数据,通过深度学习模型预测关键控制参数,实现焚烧过程的智能化控制。系统采用Python开发,结合TensorFlow/PyTorch框架,构建了完整的数据采集、预处理、特征工程、模型训练和实时预测闭环系统。该系统能够处理多变量非线性关系,适应工况变化,从历史数据中学习最优控制策略,相比传统PID控制方法具有显著优势。论文详细介绍了系统架构、算法设计和实现细节,为危废焚烧过程的优化控制提供了有效解决方案。

huanghm88的专栏 208

学Simulink——基于新型动力与推进系统的场景实例:混合动力无人机的续航能力优化

通过本次 Simulink 仿真,你已掌握:✅混合动力系统架构设计✅内燃机、电机、电池联合建模✅三种能量管理策略(规则型、功率跟随、优化型)✅续航能力仿真与对比分析✅参数调优与优化方法核心收获混合动力是突破续航瓶颈的有效路径能量管理策略(EMS)决定系统效率电池SOC管理是关键Simulink 支持复杂多能源系统的协同仿真掌握混合动力无人机技术,你将具备设计长航时巡检机、应急通信平台、边境巡逻系统的能力。

xiaoheshang_123的博客 101

OpenHarness代码解读

Harness 是包裹在大模型之外、为其赋予完整执行能力的全套基础设施。模型负责提供智能与推理,Harness 则为模型提供感知、行动、记忆、工具与安全约束,使其从语言模型变成可自主完成复杂任务的实用智能体。我这里把向量数据库方案定义为:把对话片段、事件、偏好、工具结果等切成 memory chunks,做 embedding,存进向量库,查询时靠 ANN 相似度召回,再交给 LLM 读。AAAI 的综述类论文就明确指出,很多 LLM agent 的长期记忆就是这么做的。AAAI 期刊把文件系统方案。

qq_52053775的博客 188

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

上一篇: 【Code】《代码整洁之道》笔记-附录A-并发编程II
下一篇: 【Windows】《深入浅出Windows API程序设计:编程基础篇》笔记-Chapter1-基础知识
江湖人称菠萝包
博客等级 码龄10年 762粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值