开启左侧

微信小程序开发用uniapp还是微信原生比较好?

[复制链接]
在线会员 海上明月共潮生 发表于 2023-2-6 09:51:20 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
微疑女伶 href="https://www.taojin168.com" target="_blank">小法式开辟用uniapp仍是微疑本死比力佳?

精彩评论5

avatar
在线会员 BXVHG 发表于 2023-2-6 09:51:43 | 显示全部楼层
从业务场景出发,如果只关注微信小程序,那么原生跟 uniapp 都是可以的。但如果需要一套代码兼容多端,那么 uniapp 是毋庸置疑的选择。
在应用性能方面,原生 > uniapp ;
在更新迭代方面,如果仅关注微信小程序,迭代速度两者之间没有什么差距。
回复

使用道具 举报

avatar
在线会员 BNaHK 发表于 2023-2-6 09:52:07 | 显示全部楼层
最近研究了uniCloud,并用uniCloud开发了一个性格测试小程序,已经发布到服务器,完美的发布到抖音,在抖音可以搜索到该小程序。
源码和视频教程都开源给大家了。小孟已经发布到抖音,全部的已经跑通,所以小伙伴可以拿去学习,没有任何的问题。
也出了详细的教程了!
视频的教程放在b站了,希望下坡伙伴,给个三连:


微信小程序开发用uniapp还是微信原生比较好?
https://www.bilibili.com/video/BV19u411z7Jr?spm_id_from=333.999.0.0
一,什么是uniCloud:

uniCloud是uni-app的云开发库,是 DCloud 联合阿里云、腾讯云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。
uniCloud基本抹平了不同云厂商的差异,如果你熟悉mongoDB,那么就很容易上手了!
现在用uniCloud可以大大的提高开发的效率,而且可以降低运维方面的成本,因为现在serverless还处于免费阶段。
当然也有很多的缺点,新手上手的话不是很快,很多东西也不支持,例如删除数据,竟然还要去调api。
最近小孟和老王研究了下,感觉还是可以搞的,于是就测试并发布了整个通用的版本,发布到了抖音,这个大家可以搞一下,抖音的流量你懂的,但是我们现在对赚钱不感兴趣。所以有熊伙伴想搞的,可以拿去源码学习,但是不要商用和贩卖!
二,系统界面截图:



微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?



微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?

三,核心代码演示:
  1. <template>
  2.     <view class="center">
  3.         <view class="userInfo" @click.capture="toUserInfo">
  4.             <uni-file-picker v-if="userInfo.avatar_file" v-model="userInfo.avatar_file"
  5.                 fileMediatype="image" :del-icon="false" return-type="object" :image-styles="listStyles" disablePreview
  6.                 disabled />
  7.             <image v-else class="logo-img" src="/static/uni-center/defaultAvatarUrl.png"></image>
  8.             <view class="logo-title">
  9.                 <text class="uer-name">{{userInfo.nickname||userInfo.username||userInfo.mobile||'未登录'}}</text>
  10.             </view>
  11.         </view>
  12.         <uni-list class="center-list" v-for="(sublist , index) in ucenterList" :key="index">
  13.             <uni-list-item v-for="(item,i) in sublist" :title="item.title" link :rightText="item.rightText" :key="i"
  14.                 :clickable="true" :to="item.to" @click="ucenterListClick(item)" :show-extra-icon="true"
  15.                 :extraIcon="{type:item.icon,color:'#999'}">
  16.                 <view v-if="item.showBadge" class="item-footer" slot="footer">
  17.                     <text class="item-footer-text">{{item.rightText}}</text>
  18.                     <view class="item-footer-badge"></view>
  19.                 </view>
  20.             </uni-list-item>
  21.         </uni-list>
  22.     </view>
  23. </template>
  24. <script>
  25.     import {
  26.         mapGetters,
  27.         mapMutations
  28.     } from 'vuex';
  29.     import checkUpdate from '@/uni_modules/uni-upgrade-center-app/utils/check-update';
  30.     import callCheckVersion from '@/uni_modules/uni-upgrade-center-app/utils/call-check-version';
  31.     import uniShare from 'uni_modules/uni-share/js_sdk/uni-share.js';
  32.     const db = uniCloud.database();
  33.     export default {
  34.         data() {
  35.             return {
  36.                 ucenterList: [
  37.                     [{
  38.                         "title": '问题与反馈',
  39.                         "to": '/uni_modules/uni-feedback/pages/uni-feedback/uni-feedback',
  40.                         "icon": "help"
  41.                     }, {
  42.                         "title": '设置',
  43.                         "to": '/pages/ucenter/settings/settings',
  44.                         "icon": "gear"
  45.                     }],
  46.                     [{
  47.                         "title": '关于',
  48.                         "to": '/pages/ucenter/about/about',
  49.                         "icon": "info"
  50.                     }]
  51.                 ],
  52.                 listStyles: {
  53.                     "height": "150rpx", // 边框高度
  54.                     "width": "150rpx", // 边框宽度
  55.                     "border": { // 如果为 Boolean 值,可以控制边框显示与否
  56.                         "color": "#eee", // 边框颜色
  57.                         "width": "1px", // 边框宽度
  58.                         "style": "solid", // 边框样式
  59.                         "radius": "100%" // 边框圆角,支持百分比
  60.                     }
  61.                 }
  62.             }
  63.         },
  64.         onLoad() {
  65.             //#ifdef APP-PLUS
  66.             this.ucenterList[this.ucenterList.length - 2].unshift({
  67.                 title: '检查更新',
  68.                 rightText: this.appVersion.version + '-' + this.appVersion.versionCode,
  69.                 event: 'checkVersion',
  70.                 icon: 'loop',
  71.                 showBadge: this.appVersion.hasNew
  72.             })
  73.             //#endif
  74.         },
  75.         computed: {
  76.             ...mapGetters({
  77.                 userInfo: 'user/info',
  78.                 login: 'user/hasLogin'
  79.             })
  80.             // #ifdef APP-PLUS
  81.             ,
  82.             appVersion() {
  83.                 return getApp().appVersion
  84.             }
  85.             // #endif
  86.             ,
  87.             appConfig() {
  88.                 return getApp().globalData.config
  89.             }
  90.         },
  91.         methods: {
  92.             ...mapMutations({
  93.                 setUserInfo: 'user/login'
  94.             }),
  95.             toSettings() {
  96.                 uni.navigateTo({
  97.                     url: "/pages/ucenter/settings/settings"
  98.                 })
  99.             },
  100.             /**
  101.              * 个人中心项目列表点击事件
  102.              */
  103.             ucenterListClick(item) {
  104.                 if (!item.to && item.event) {
  105.                     this[item.event]();
  106.                 }
  107.             },
  108.             async checkVersion() {
  109.                 let res = await callCheckVersion()
  110.                 console.log(res);
  111.                 if (res.result.code > 0) {
  112.                     checkUpdate()
  113.                 } else {
  114.                     uni.showToast({
  115.                         title: res.result.message,
  116.                         icon: 'none'
  117.                     });
  118.                 }
  119.             },
  120.             toUserInfo() {
  121.                 uni.navigateTo({
  122.                     url: '/pages/ucenter/userinfo/userinfo'
  123.                 })
  124.             },
  125.             /**
  126.              * 去应用市场评分
  127.              */
  128.             gotoMarket() {
  129.                 // #ifdef APP-PLUS
  130.                 if (uni.getSystemInfoSync().platform == "ios") {
  131.                     // 这里填写appstore应用id
  132.                     let appstoreid = this.appConfig.marketId.ios; // 'id1417078253';
  133.                     plus.runtime.openURL("itms-apps://" + 'itunes.apple.com/cn/app/wechat/' + appstoreid + '?mt=8');
  134.                 }
  135.                 if (uni.getSystemInfoSync().platform == "android") {
  136.                     var Uri = plus.android.importClass("android.net.Uri");
  137.                     var uri = Uri.parse("market://details?id=" + this.appConfig.marketId.android);
  138.                     var Intent = plus.android.importClass('android.content.Intent');
  139.                     var intent = new Intent(Intent.ACTION_VIEW, uri);
  140.                     var main = plus.android.runtimeMainActivity();
  141.                     main.startActivity(intent);
  142.                 }
  143.                 // #endif
  144.             },
  145.             async share() {
  146.                 let {result} = await uniCloud.callFunction({
  147.                     name: 'uni-id-cf',
  148.                     data: {
  149.                         action: 'getUserInviteCode'
  150.                     }
  151.                 })
  152.                 console.log(result);
  153.                 let myInviteCode = result.myInviteCode || result.userInfo.my_invite_code
  154.                 console.log(myInviteCode);
  155.                 let {
  156.                     appName,
  157.                     logo,
  158.                     company,
  159.                     slogan
  160.                 } = this.appConfig.about
  161.                 // #ifdef APP-PLUS
  162.                 uniShare({
  163.                     content: { //公共的分享类型(type)、链接(herf)、标题(title)、summary(描述)、imageUrl(缩略图)
  164.                         type: 0,
  165.                         href: this.appConfig.h5.url +
  166.                             `/#/pages/ucenter/invite/invite?code=${myInviteCode}`,
  167.                         title: appName,
  168.                         summary: slogan,
  169.                         imageUrl: logo + '?x-oss-process=image/resize,m_fill,h_100,w_100' //压缩图片解决,在ios端分享图过大导致的图片失效问题
  170.                     },
  171.                     menus: [{
  172.                             "img": "/static/app-plus/sharemenu/wechatfriend.png",
  173.                             "text": "微信好友",
  174.                             "share": {
  175.                                 "provider": "weixin",
  176.                                 "scene": "WXSceneSession"
  177.                             }
  178.                         },
  179.                         {
  180.                             "img": "/static/app-plus/sharemenu/wechatmoments.png",
  181.                             "text": "",
  182.                             "share": {
  183.                                 "provider": "weixin",
  184.                                 "scene": "WXSenceTimeline"
  185.                             }
  186.                         },
  187.                         {
  188.                             "img": "/static/app-plus/sharemenu/weibo.png",
  189.                             "text": "微博",
  190.                             "share": {
  191.                                 "provider": "sinaweibo"
  192.                             }
  193.                         },
  194.                         {
  195.                             "img": "/static/app-plus/sharemenu/qq.png",
  196.                             "text": "QQ",
  197.                             "share": {
  198.                                 "provider": "qq"
  199.                             }
  200.                         },
  201.                         {
  202.                             "img": "/static/app-plus/sharemenu/copyurl.png",
  203.                             "text": "复制",
  204.                             "share": "copyurl"
  205.                         },
  206.                         {
  207.                             "img": "/static/app-plus/sharemenu/more.png",
  208.                             "text": "更多",
  209.                             "share": "shareSystem"
  210.                         }
  211.                     ],
  212.                     cancelText: "取消分享",
  213.                 }, e => { //callback
  214.                     console.log(e);
  215.                 })
  216.                 // #endif
  217.             }
  218.         }
  219.     }
  220. </script>
  221. <style>
  222.     /* #ifndef APP-PLUS-NVUE */
  223.     page {
  224.         background-color: #f8f8f8;
  225.     }
  226.     /* #endif*/
  227.     .center {
  228.         flex: 1;
  229.         flex-direction: column;
  230.         background-color: #f8f8f8;
  231.     }
  232.     .userInfo {
  233.         width: 750rpx;
  234.         padding: 20rpx;
  235.         padding-top: 50px;
  236.         background-image: url(../../static/uni-center/headers.png);
  237.         flex-direction: column;
  238.         align-items: center;
  239.     }
  240.     .logo-img {
  241.         width: 150rpx;
  242.         height: 150rpx;
  243.         border-radius: 150rpx;
  244.     }
  245.     .logo-title {
  246.         flex: 1;
  247.         align-items: center;
  248.         justify-content: space-between;
  249.         flex-direction: row;
  250.     }
  251.     .uer-name {
  252.         height: 100rpx;
  253.         line-height: 100rpx;
  254.         font-size: 38rpx;
  255.         color: #FFFFFF;
  256.     }
  257.     .center-list {
  258.         margin-bottom: 30rpx;
  259.         background-color: #f9f9f9;
  260.     }
  261.     .center-list-cell {
  262.         width: 750rpx;
  263.         background-color: #007AFF;
  264.         height: 40rpx;
  265.     }
  266.     .grid {
  267.         background-color: #FFFFFF;
  268.         margin-bottom: 6px;
  269.     }
  270.     .uni-grid .text {
  271.         font-size: 30rpx;
  272.         height: 25px;
  273.         line-height: 25px;
  274.         color: #817f82;
  275.     }
  276.     .uni-grid .item /deep/ .uni-grid-item__box {
  277.         justify-content: center;
  278.         align-items: center;
  279.     }
  280.     /*修改边线粗细示例*/
  281.     /* #ifndef APP-NVUE */
  282.     .center-list /deep/ .uni-list--border:after {
  283.         -webkit-transform: scaleY(0.2);
  284.         transform: scaleY(0.2);
  285.         margin-left: 80rpx;
  286.     }
  287.     .center-list /deep/ .uni-list--border-top,
  288.     .center-list /deep/ .uni-list--border-bottom {
  289.         display: none;
  290.     }
  291.     /* #endif */
  292.     .item-footer {
  293.         flex-direction: row;
  294.         align-items: center;
  295.     }
  296.     .item-footer-text {
  297.         color: #999;
  298.         font-size: 24rpx;
  299.         padding-right: 10rpx;
  300.     }
  301.     .item-footer-badge {
  302.         width: 20rpx;
  303.         height: 20rpx;
  304.         /* #ifndef APP-NVUE */
  305.         border-radius: 50%;
  306.         /* #endif */
  307.         /* #ifdef APP-NVUE */
  308.         border-radius: 10rpx;
  309.         /* #endif */
  310.         background-color: #DD524D;
  311.     }
  312. </style>
  313. <script>
  314. import uQRCode from './uqrcode.js'
  315. export default {
  316.   props: {
  317.    cid: {
  318.     type: String,
  319.     default(){
  320.      return Date.now()+Math.random()+'';
  321.     }
  322.    },
  323.    text: {
  324.     type: String,
  325.     required: true
  326.    },
  327.    size: {
  328.     type: Number,
  329.     default: uni.upx2px(200)
  330.    },
  331.    margin: {
  332.     type: Number,
  333.     default: 0
  334.    },
  335.    backgroundColor: {
  336.     type: String,
  337.     default: '#ffffff'
  338.    },
  339.    foregroundColor: {
  340.     type: String,
  341.     default: '#000000'
  342.    },
  343.    backgroundImage: {
  344.     type: String
  345.    },
  346.    logo: {
  347.     type: String
  348.    },
  349.    makeOnLoad: {
  350.     type: Boolean,
  351.     default: false
  352.    }
  353.   },
  354.   data() {
  355.    return {
  356.    }
  357.   },
  358.   mounted() {
  359.    if (this.makeOnLoad) {
  360.     this.make()
  361.    }
  362.   },
  363.   methods: {
  364.    async make() {
  365.     var options = {
  366.      canvasId: this.cid,
  367.      componentInstance: this,
  368.      text: this.text,
  369.      size: this.size,
  370.      margin: this.margin,
  371.      backgroundColor: this.backgroundImage ? 'rgba(255,255,255,0)' : this.backgroundColor,
  372.      foregroundColor: this.foregroundColor
  373.     }
  374.     var filePath = await this.makeSync(options)
  375.     if (this.backgroundImage) {
  376.      filePath = await this.drawBackgroundImageSync(filePath)
  377.     }
  378.     if (this.logo) {
  379.      filePath = await this.drawLogoSync(filePath)
  380.     }
  381.     this.makeComplete(filePath)
  382.    },
  383.    makeComplete(filePath) {
  384.     this.$emit('makeComplete', filePath)
  385.    },
  386.    drawBackgroundImage(options) {
  387.     var ctx = uni.createCanvasContext(this.cid, this)
  388.     ctx.drawImage(this.backgroundImage, 0, 0, this.size, this.size)
  389.     ctx.drawImage(options.filePath, 0, 0, this.size, this.size)
  390.     ctx.draw(false, () => {
  391.      uni.canvasToTempFilePath({
  392.       canvasId: this.cid,
  393.       success: res => {
  394.        options.success && options.success(res.tempFilePath)
  395.       },
  396.       fail: error => {
  397.        options.fail && options.fail(error)
  398.       }
  399.      }, this)
  400.     })
  401.    },
  402.    async drawBackgroundImageSync(filePath) {
  403.     return new Promise((resolve, reject) => {
  404.      this.drawBackgroundImage({
  405.       filePath: filePath,
  406.       success: res => {
  407.        resolve(res)
  408.       },
  409.       fail: error => {
  410.        reject(error)
  411.       }
  412.      })
  413.     })
  414.    },
  415.    fillRoundRect(ctx, r, x, y, w, h) {
  416.     ctx.save()
  417.     ctx.translate(x, y)
  418.     ctx.beginPath()
  419.     ctx.arc(w - r, h - r, r, 0, Math.PI / 2)
  420.     ctx.lineTo(r, h)
  421.     ctx.arc(r, h - r, r, Math.PI / 2, Math.PI)
  422.     ctx.lineTo(0, r)
  423.     ctx.arc(r, r, r, Math.PI, Math.PI * 3 / 2)
  424.     ctx.lineTo(w - r, 0)
  425.     ctx.arc(w - r, r, r, Math.PI * 3 / 2, Math.PI * 2)
  426.     ctx.lineTo(w, h - r)
  427.     ctx.closePath()
  428.     ctx.setFillStyle('#ffffff')
  429.     ctx.fill()
  430.     ctx.restore()
  431.    },
  432.    drawLogo(options) {
  433.     var ctx = uni.createCanvasContext(this.cid, this)
  434.     ctx.drawImage(options.filePath, 0, 0, this.size, this.size)
  435.     var logoSize = this.size / 4
  436.     var logoX = this.size / 2 - logoSize / 2
  437.     var logoY = logoX
  438.     var borderSize = logoSize + 10
  439.     var borderX = this.size / 2 - borderSize / 2
  440.     var borderY = borderX
  441.     var borderRadius = 5
  442.     this.fillRoundRect(ctx, borderRadius, borderX, borderY, borderSize, borderSize)
  443.     ctx.drawImage(this.logo, logoX, logoY, logoSize, logoSize)
  444.     ctx.draw(false, () => {
  445.      uni.canvasToTempFilePath({
  446.       canvasId: this.cid,
  447.       success: res => {
  448.        options.success && options.success(res.tempFilePath)
  449.       },
  450.       fail: error => {
  451.        options.fail && options.fail(error)
  452.       }
  453.      }, this)
  454.     })
  455.    },
  456.    async drawLogoSync(filePath) {
  457.     return new Promise((resolve, reject) => {
  458.      this.drawLogo({
  459.       filePath: filePath,
  460.       success: res => {
  461.        resolve(res)
  462.       },
  463.       fail: error => {
  464.        reject(error)
  465.       }
  466.      })
  467.     })
  468.    },
  469.    async makeSync(options) {
  470.     return new Promise((resolve, reject) => {
  471.      uQRCode.make({
  472.       canvasId: options.canvasId,
  473.       componentInstance: options.componentInstance,
  474.       text: options.text,
  475.       size: options.size,
  476.       margin: options.margin,
  477.       backgroundColor: options.backgroundColor,
  478.       foregroundColor: options.foregroundColor,
  479.       success: res => {
  480.        resolve(res)
  481.       },
  482.       fail: error => {
  483.        reject(error)
  484.       }
  485.      })
  486.     })
  487.    }
  488.   }
  489. }
  490. </script>
复制代码
四,代码获取:

这个系统小孟也开发了很久,有小伙伴说需要学习,狠狠心,给大家开源了,拿去学习吧,:
我把小程序发布到抖音啦!【开源了】对于程序开发这块,需要不断的练习,不断的改bug,才能成长,遇到bug别慌,因为以后有改不完的bug!
回复

使用道具 举报

avatar
在线会员 e6fNY0ENR 发表于 2023-2-6 09:52:47 | 显示全部楼层
01、新建一个uniapp项目

打卡开发工具【文件】-【新建项目】选择Uniapp即可

微信小程序开发用uniapp还是微信原生比较好?
02、设置uniapp和微信小程序开发工具的关联

02-1、安装微信小程序,并且找到按照目录


微信小程序开发用uniapp还是微信原生比较好?
比如作者的是:C:\Program Files (x86)\Tencent\微信web开发者工具
02-2、hbuilderx关联微信小程序开发工具


微信小程序开发用uniapp还是微信原生比较好?
找到【运行配置】在这里可以关联所有小程序

微信小程序开发用uniapp还是微信原生比较好?
03、应用程序取名字及生成应用图标
03-1、找到创建的项目找到【manifest.json】基础配置获取一个标识和取名字为【学相伴】


微信小程序开发用uniapp还是微信原生比较好?
取的这个名字未来安卓或者ios中应用的名称,但是对于小程序没有用,因为各自的小程序都是根据它们对应的后台去处理和生成的。
03-2、APP图标设置


微信小程序开发用uniapp还是微信原生比较好?
03-3、APP启动界面配置

保持默认不变即可,或者自己进行研究一下。
03-4、APP模块配置


微信小程序开发用uniapp还是微信原生比较好?
03-5、微信小程序设置


微信小程序开发用uniapp还是微信原生比较好?
微信小程序配置相关
01、添加开发人员和体验人员

目的:可以共同维护和开发这个小程序

微信小程序开发用uniapp还是微信原生比较好?
02、添加外部资源的合法性和展示

微信小程序开发用uniapp还是微信原生比较好?
03、微信小程序工具创建微信小程序项目


微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?
04、创建项目的配置说明

微信小程序开发用uniapp还是微信原生比较好?
05、项目预览


微信小程序开发用uniapp还是微信原生比较好?
06、项目上传和发布


微信小程序开发用uniapp还是微信原生比较好?
07、微信认证和设置

微信小程序开发用uniapp还是微信原生比较好?
运行uniapp应用到微信小程序开发工具中

01、运行和编译一个uniapp项目到微信小程序开发工具中


微信小程序开发用uniapp还是微信原生比较好?
02、hbuilderx主题设置

微信小程序开发用uniapp还是微信原生比较好?
修改后

微信小程序开发用uniapp还是微信原生比较好?
03、hbuilderx插件安装

03-1、自带插件安装


微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?
03-2、第三方插件
插件应用市场:https://ext.dcloud.net.cn/
微信小程序开发用uniapp还是微信原生比较好?

微信小程序开发用uniapp还是微信原生比较好?
04、hbuilderx字体大小的改变
1、按住Ctrl键不放+鼠标滚轮 2、在【设置中】找到常用设置即可

微信小程序开发用uniapp还是微信原生比较好?
05、uniapp项目目录结构说明和介绍


微信小程序开发用uniapp还是微信原生比较好?
06、定义第一个页面及运行到微信小程序中


微信小程序开发用uniapp还是微信原生比较好?
运行以后如下:

微信小程序开发用uniapp还是微信原生比较好?
07、运行到浏览器中(H5)


微信小程序开发用uniapp还是微信原生比较好?

运行以后如下:

微信小程序开发用uniapp还是微信原生比较好?
回复

使用道具 举报

avatar
在线会员 2p9KVB 发表于 2023-2-6 09:53:42 | 显示全部楼层
各有各的优势, uni 能够一套代码多个平台兼容,但是有些功能好像是是想不了的
   微信源生相对来说是比较靠谱的, 不过就是兼容性小一点的
回复

使用道具 举报

avatar
在线会员 rreXZ 发表于 2023-2-6 09:54:11 | 显示全部楼层
如果只是考虑微信小程序,当然是原生更好些
uniapp主要是为了方便多端运行,但中间也需要穿插非常多兼容性的代码,做过就知道,每个平台都有自己的一些特殊性代码。开发起来也是有一定折腾。
所以不是考虑全平台的话,走原生是非常便捷的一种开发方式,但是有兴趣的话可以用uniapp,毕竟谁知道哪天会要求上其他平台呢,多个尝试多条路
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 qq_login

本版积分规则

发布主题
阅读排行更多+
用专业创造成效
400-778-7781
周一至周五 9:00-18:00
意见反馈:server@mailiao.group
紧急联系:181-67184787
ftqrcode

扫一扫关注我们

Powered by 职贝云数A新零售门户 X3.5© 2004-2025 职贝云数 Inc.( 蜀ICP备2024104722号 )