roleSet.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. <template>
  2. <view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
  3. <cus-header title='配置角色' bgColor="transparent"></cus-header>
  4. <div class="title">助手昵称</div>
  5. <div class="inp">
  6. <input v-model="agentDto.agentName" type="text" placeholder="请输入昵称">
  7. </div>
  8. <div class="title">角色模板</div>
  9. <div class="list">
  10. <div class="pre" v-for="(item,index) in list" :key="index" :class="{'active':midx===index}" @tap="changeModel(item,index)">
  11. <image src="@/static/selected.png" v-if="midx===index"></image>
  12. {{item.agentName}}
  13. </div>
  14. </div>
  15. <div class="title">角色介绍</div>
  16. <div class="intro">
  17. <u-parse :content="agentDto.systemPrompt"></u-parse>
  18. </div>
  19. <div class="title">角色音色</div>
  20. <div class="inp" @tap="show=true">
  21. <input type="text" placeholder="请选择音色" disabled v-if="!agentDto.ttsVoiceId">
  22. <text v-else>{{voiceText}}</text>
  23. </div>
  24. <div class="zt_btn" @tap="comfirmSure">确定</div>
  25. <u-picker :itemHeight="88" title="角色音色" :show="show" :columns="voiceList" keyName="name"
  26. @cancel="show=false" @confirm="confirm" :immediateChange="true" style="height: 500rpx;">
  27. </u-picker>
  28. </view>
  29. </template>
  30. <script>
  31. export default {
  32. data(){
  33. return {
  34. id:'',
  35. agentId:'',
  36. agentDto:null,
  37. list:[],
  38. midx:0,
  39. modelMap:new Map(),
  40. midx:0,
  41. voiceText:'',
  42. voiceList:[],
  43. show:false
  44. }
  45. },
  46. async onLoad(option) {
  47. this.id = option.id;
  48. this.agentId = option.agentId;
  49. await this.getDetail();
  50. await this.getAgentModelList()
  51. this.getModelVoiceList()
  52. },
  53. methods:{
  54. getDetail(){
  55. return new Promise((resolve,reject)=>{
  56. this.$api.get(`/agent/${this.id}`).then(res=>{
  57. if(res.data.code!==0) return this.$showToast(res.data.msg)
  58. this.agentDto = res.data.data;
  59. resolve();
  60. })
  61. })
  62. },
  63. getAgentModelList(){
  64. return new Promise((resolve,reject)=>{
  65. this.$api.get('/agent/template').then(res=>{
  66. if(res.data.code!==0) return this.$showToast(res.data.msg)
  67. this.list = res.data.data;
  68. let idx = this.list.findIndex(l=>l.systemPrompt===this.agentDto.systemPrompt);
  69. if(idx>-1){
  70. this.midx = idx;
  71. }
  72. if(this.list.length){
  73. let map = new Map();
  74. this.list.forEach(l=>{
  75. map.set(l.agentName,l)
  76. })
  77. this.modelMap = map;
  78. }
  79. resolve();
  80. })
  81. })
  82. },
  83. getModelVoiceList(){
  84. this.$api.get(`/models/${this.agentDto.ttsModelId}/voices`).then(res=>{
  85. if(res.data.code!==0) return this.$showToast(res.data.msg)
  86. this.voiceList = [res.data.data];
  87. this.voiceText = res.data.data.find(v=>v.id===this.agentDto.ttsVoiceId)?.name||'';
  88. })
  89. },
  90. confirm(e){
  91. this.show = false;
  92. this.agentDto.ttsVoiceId = e.value[0].id;
  93. this.voiceText = e.value[0].name;
  94. },
  95. changeModel(item,index){
  96. this.midx = index;
  97. this.agentDto = {...this.agentDto,...this.modelMap.get(item.agentName)};
  98. this.getModelVoiceList()
  99. },
  100. comfirmSure(){
  101. let dto = JSON.parse(JSON.stringify(this.agentDto));
  102. this.$api.put('/agent/'+this.agentId,dto).then(res=>{
  103. if(res.data.code!==0) return this.$showToast(res.data.msg)
  104. this.$showToast('配置成功');
  105. setTimeout(()=>{
  106. uni.reLaunch({
  107. url:'/pages/home'
  108. })
  109. },1500)
  110. })
  111. },
  112. }
  113. }
  114. </script>
  115. <style scoped lang="less">
  116. .page{
  117. background: linear-gradient( 180deg, #E0EEFF 0%, #F6FCFF 100%);
  118. padding: 0 30rpx 30rpx;
  119. box-sizing: border-box;
  120. .title{
  121. font-family: PingFang-SC, PingFang-SC;
  122. font-weight: bold;
  123. font-size: 32rpx;
  124. color: #111111;
  125. line-height: 32rpx;
  126. margin-top: 48rpx;
  127. }
  128. .inp{
  129. margin-top: 40rpx;
  130. background: #FFFFFF;
  131. border-radius: 16rpx;
  132. padding: 30rpx 24rpx;
  133. input{
  134. border: none;
  135. }
  136. }
  137. .list{
  138. margin-top: 20rpx;
  139. display: flex;
  140. flex-wrap: wrap;
  141. margin-left: -10rpx;
  142. .pre{
  143. margin-top: 20rpx;
  144. margin-left: 10rpx;
  145. width: calc(100% / 3 - 10rpx);
  146. height: 80rpx;
  147. background: #FFFFFF;
  148. border-radius: 16rpx;
  149. font-family: PingFangSC, PingFang SC;
  150. font-weight: 400;
  151. font-size: 28rpx;
  152. color: #333333;
  153. line-height: 80rpx;
  154. text-align: center;
  155. position: relative;
  156. &.active{
  157. background: #0066FE;
  158. font-weight: bold;
  159. color: #FFFFFF;
  160. }
  161. image{
  162. width: 48rpx;
  163. height: 48rpx;
  164. position: absolute;
  165. right: 0;
  166. bottom: 0;
  167. z-index: 22;
  168. }
  169. }
  170. }
  171. .intro{
  172. margin-top: 40rpx;
  173. background: #FFFFFF;
  174. border-radius: 16rpx;
  175. padding: 21rpx 24rpx 100rpx;
  176. font-family: PingFangSC, PingFang SC;
  177. font-weight: 400;
  178. font-size: 28rpx;
  179. color: #616161;
  180. line-height: 56rpx;
  181. }
  182. .zt_btn{
  183. margin-top: 96rpx;
  184. }
  185. }
  186. </style>